每日算法(一)

每日算法(一)

704. 二分查找

示例 1:

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

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2     
输出: -1        
解释: 2 不存在 nums 中因此返回 -1     
  • 你可以假设 nums 中的所有元素是不重复的。

  • n 将在 [1, 10000]之间。

  • nums 的每个元素都将在 [-9999, 9999]之间。

public static int search(int [] nums,int target){
    int l = 0;
    int r = nums.length - 1;
    int[] array = Arrays.stream(nums).sorted().toArray();
    while(l<=r){
        int mid = (l + r) / 2;
        if(array[mid]>target){
            r = mid - 1;
        } else if (array[mid] == target) {
            return mid;
        }
        else {
            l = mid + 1;
        }
    }
    return -1;
}
  1. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素。

public int removeElement(int[] nums, int val){
    int l = 0,r = 0;
    while (r<nums.length){
        if (nums[r]!=val){
            nums[l++] = nums[r];
        }
        r++;
    }
    return l;
}

977.有序数组的平方

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

示例 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]\

第一种方法

public int[] sortedSquares(int[] nums){
//        int l = 0,r = nums.length - 1;
//        while(l<=r){
//
//        }
​
        return Arrays.stream(nums)
                .map(n -> n * n) // 对每个元素进行平方操作
                .sorted() // 按升序排序
                .toArray();
​
    }

第二种方法

public int[] sortedSquares(int[] nums){
    int l = 0,r = nums.length - 1;
    int [] result = new int[nums.length];
    int index = nums.length-1;
    while(l<=r){
        if(Math.abs(nums[l])>Math.abs(nums[r])){
            result[index--] = (int) Math.pow(nums[l],2);
            l++;
        }else{
            result[index--] = (int) Math.pow(nums[r],2);
            r--;
        }
    }
    return result;
​
}

209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

  • 输入:s = 7, nums = [2,3,1,2,4,3]

  • 输出:2

  • 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

提示:

  • 1 <= target <= 10^9

  • 1 <= nums.length <= 10^5

  • 1 <= nums[i] <= 10^5

##

public int[] sortedSquares(int[] nums){
    int l = 0,r = nums.length - 1;
    int [] result = new int[nums.length];
    int index = nums.length-1;
    while(l<=r){
        if(Math.abs(nums[l])>Math.abs(nums[r])){
            result[index--] = (int) Math.pow(nums[l],2);
            l++;
        }else{
            result[index--] = (int) Math.pow(nums[r],2);
            r--;
        }
    }
    return result;
​
}

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素。

class Solution {
    public int removeElement(int[] nums, int val) {
        // 快慢指针
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
}

总结 :双指针专场

LICENSED UNDER CC BY-NC-SA 4.0