算法训练第二天 |977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方 

题目链接

public int[] sortedSquares(int[] nums) {
        int head = 0;
        int tail = nums.length-1;
        int[] newnums = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            if(nums[head]*nums[head] > nums[tail]*nums[tail]){
                newnums[newnums.length-1-i] = nums[head] * nums[head];
                head++;
            }else {
                newnums[newnums.length-1-i] = nums[tail] * nums[tail];
                tail--;
            }
        }
        return newnums;
    }

这道题利用了双指针,因为数组是有序的,且负数越小的数平方后越大,正数越大的数平方后越大,正好在数组的两边,就在前后各放一个指针,每次比较指向的数的平方,把大的数取出来倒序存在数组中,取出后改变指针,直到取出nums.length个数。

209.长度最小的子数组

题目链接

 public int minSubArrayLen(int target, int[] nums) {
        int right = 0;
        int left = 0;
        int min = nums.length + 1;
        int sum = 0;
        while (right < nums.length){
            sum += nums[right];
            if(sum >= target){
                while (sum >= target && left <= right){
                    sum -= nums[left];
                    left++;
                }
                min = min < (right - left + 2) ? min : (right - left + 2);
            }
            right++;
        }
        if(min == nums.length + 1)
            return 0;
        else return min;

    }

这道题里运用了滑动窗口的思想,选择左右两个指针,外循环中循环一次把右指针指向的数加入到sum中,当sum>=target时进入到内循环,在内循环中对窗口的左指针进行改变,当sumright时跳出内循环,left左移一位就是以右指针为尾的最短子数组,和min作比较,小于保留,继续循环,最后得出结果。

59.螺旋矩阵II

题目链接

public int[][] generateMatrix(int n) {

        int [][] nums = new int[n][n];
        int x = 0;
        int y = 0;
        int fre = 0;
        int len = n-1;
        int data = 1;
        for (; x < n; x++) {
            nums[0][x] = data++;
        }
        x--;
        for (int i = 0; i < 2*n-1; i++) {

            if(fre == 2){
                fre = 0;
                len--;
            }
            if((x + y) < (n - 1)){
                x++;
                for (int j = 0; j < len; j++) {
                    nums[y][x] = data++;
                    x++;

                }
                x--;
            }else if((x + y) > (n - 1)){
                x--;
                for (int j = 0; j < len; j++) {
                    nums[y][x] = data++;
                    x--;

                }
                x++;
            }else if(x > y){
                y++;
                for (int j = 0; j < len; j++) {
                    nums[y][x] = data++;
                    y++;

                }
                y--;
            }else{
                y--;
                for (int j = 0; j < len; j++) {
                    nums[y][x] = data++;
                    y--;

                }
                y++;
            }
          fre++;
        }
        return nums;
    }

这道题我写复杂了,正常写右下左上的顺序就可以,不用判断x,y关系,只需要坚持循环不变量原则就可以。

你可能感兴趣的:(算法,矩阵,java)