Leetcode刷题第二天 | 977.有序数组的平方,209.长度最小的子数组, 59.螺旋矩阵II

977.有序数组的平方

左右指针法

平方(遍历数组O(n)) 再排序(O(nlogn))  复杂度有O(nlogn),为了达到O(n)的复杂度,我们观察数组发现非递减数列平方后最大值肯定出在数列两侧,所以我们可以用左右指针法,比较左右指针的大小,分别向中间靠拢。

def sortedSquares(self, nums):
        n =len(nums)
        left = 0
        right = n - 1
        ans = [-1]* n
        i = n - 1
        while(left <= right):
            ll = nums[left] **2
            rr = nums[right] **2
            if ll>=rr:
                ans[i] = ll
                left +=1
            else:
                ans[i] = rr
                right -= 1
            i -= 1
        return ans

209.长度最小的子数组


滑动窗口

一个O(N)的for循环,其中遍历的是滑动窗口的终止位置。当窗口长度达到target时,用while循环不断增加窗口的起始位置来缩短窗口。

public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int i = 0;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for(int j = 0; j<n; j++){
            sum += nums[j];
            while (sum >=target) {
                result = Math.min(result,j-i+1);
                sum -= nums[i++];          
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }

59.螺旋矩阵II

转晕了。。。先确定转几圈(loop),如果n是奇数,最后要把最中间的值填上。

 

public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int count = 1;
        int start = 0;
        int i, j;

        for (int loop = 1; loop <= n/2; loop++){
            for (j = start; j < n - loop; j++) {
                res[start][j] = count++;
            }

            for (i = start; i < n - loop; i++) {
                res[i][j] = count++;
            }

            for (; j >= loop; j--) {
                res[i][j] = count++;
            }
            for (; i >= loop; i--) {
                res[i][j] = count++;
            }
            start++;

        }
        
        if (n % 2 == 1) {
            res[start][start] = count;
        }
        return res;
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值