代码随想录-2023/06/29

178 阅读1分钟

977.有序数组的平方

解法1:计算每个数字的平方,然后进行排序,时间复杂度为O(n^2)

代码:

class Solution {
    public int[] sortedSquares(int[] nums) {
        // O(n^2)
        for(int i=0; i<nums.length; i++){
            nums[i] = nums[i] * nums[i];
        } 
        Arrays.sort(nums);
        return nums;

    }
}

解法2:

观察特点-双指针法: 正数和负数是有序的,所以对于两个有序序列进行归并排序即可,从两端进行绝对值比较,绝对值大的肯定平方后最大,放在最后的位置上即可

代码:


class Solution {
    public int[] sortedSquares(int[] nums) {
       // 时间复杂度为O(n)
       int[] ans = new int[nums.length];
       int idx = nums.length-1;
       int l = 0, r = nums.length-1;
       while(l <= r){
           if(Math.abs(nums[l]) > Math.abs(nums[r])){
               ans[idx--] = nums[l] * nums[l];
               l++;
           }else{
               ans[idx--] = nums[r] * nums[r];
               r--;
           }
       }

       return ans;
    }
}

209.长度最小的子数组

解题思路: 题目都是正整数,所以越加只会越大,不会变小 利用滑动窗口,当窗口内的和大于target时,删除窗口头部的值,当小于target时,增大窗口的值,整个过程记录窗口内>=target的窗口最小长度

代码:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        // 滑动窗口
        int l = 0, r = 0, sum = 0;
        int ans = 0x7fffffff;
        while(r < nums.length){
            sum += nums[r++];
            while(sum >= target){
                ans = Math.min(ans, r - l);
                sum -= nums[l++];
            }
        }

        return ans==0x7fffffff ? 0:ans;
    }
}