算法Day1|704-二分查找;27-移除元素;977-有序数组的平方

前言

今天是数组刷题,尽管看着都是简单的题,且之前刷过几次,但是还是耗时接近2小时。

  • 704-二分查找:2024-10-16 通过
  • 27-移除元素:2024-10-16 通过
  • 977-有序数组的平方:2024-10-16 通过

1、题目1:704-二分查找

题目链接:leetcode.cn/problems/bi...

难度:简单
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

示例 1:

makefile 复制代码
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

makefile 复制代码
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

代码:

sql 复制代码
public class Number_704 {

    public static int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right){
            int mid = left + (right - left)/2 ;
            if(nums[mid] > target){
                right--;
            } else if (nums[mid] < target) {
                left++;
            }else{
                return mid;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] ints = {-1, 0, 3, 5, 9, 12};
        int search = search(ints, 9);
        System.out.println(search);
    }
}

思路小结:

  • 记住一种常用的写法即可,while(left <= right),然后 mid+1 和 mid-1
  • Mid 计算不越界

2、题目2:27-移除元素

题目链接:leetcode.cn/problems/re...

难度:简单

题目

给你一个数组 nums **和一个值 val,你需要 原地 移除所有数值等于 val **的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

思路

  • 原地删除元素可以考虑双指针法,而且是快慢指针
  • Slow 的值就是不相等的个数,默认是0开始计算

代码:

ini 复制代码
public class Number_27 {
    public static void main(String[] args) {
        int[] ints = {0,1,2,2,3,0,4,2};
        int search = removeElement(ints, 2);
        System.out.println(search);
    }

    public static int removeElement(int[] nums, int val) {
        int slow =0;
        for (int fast = 0; fast < nums.length; fast++) {
            if(nums[fast] != val){
                // 将等于 val 的元素都移动到最后面
nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
}

3、题目3:977-有序数组的平方

题目链接:leetcode.cn/problems/sq...

难度:简单

题目:

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

ini 复制代码
示例 1:
输入: nums = [-4,-1,0,3,10]
输出: [0,1,9,16,100]

解释: 平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:
输入: nums = [-7,-3,2,3,11]
输出: [4,9,9,49,121]

思路

  • 数组的常用解法就是双指针,这题也可以用到,一头一尾指针

  • 通过比较头指针和尾指针的大小,可以得到一个最大值(非递减顺序排序的)。

  • 初始化一个数组,依次往最后一个位置插入元素

代码

ini 复制代码
public class Number_977 {
    public static void main(String[] args) {
        int[] nums ={-4,-1,0,3,10};
        int[] ints = sortedSquares(nums);
        for (int i : ints) {
            System.out.println(i);
        }
    }

    public static int[] sortedSquares(int[] nums) {
        int[] result = new int[nums.length];
        int index= nums.length-1;
        int slow = 0;
        int fast = nums.length -1;
        while (slow <= fast) {
            int slowval = nums[slow]* nums[slow];
            int fastval = nums[fast]* nums[fast];
            if(slowval < fastval){
                fast--;
                result[index--] = fastval;
            }else{
                slow++;
                result[index--] = slowval;
            }
        }
        return result;
    }
}

其他思路想法:

  • 采用提供的工具 Arrays.sort(nums)即可完成排序,非常快
相关推荐
神仙别闹10 分钟前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭34 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
XH华38 分钟前
初识C语言之二维数组(下)
c语言·算法
暮湫1 小时前
泛型(2)
java
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
南宫生1 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石1 小时前
12/21java基础
java
不想当程序猿_1 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
李小白661 小时前
Spring MVC(上)
java·spring·mvc
落魄君子1 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘