代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977.有序数组的平方

题目连接:link

我的思路

看到题目第一眼那就是暴力做,纯纯的暴力,直接先全部先平方然后用Java自带的排序进行排序,这就结束了。

代码

class Solution {
    public int[] sortedSquares(int[] nums) {
        for(int i=0;i<nums.length;i++){
        //对数组中的每个数进行平方
            nums[i]=(int)Math.pow(nums[i],2);
        }
        //从小到大排序
        Arrays.sort(nums);
        return nums;
    }
}

学到的新想法

既然是学习,那当然是不能就这样结束了,看了资料和视频后,了解到可以双指针的做法来考虑,首先先看题目,给我们的数组本身是经过排序的,只不过其中有负数,会出现负数平方后比正数的平方要大的情况,那么我们只要比较负数的平方和正数的平方谁大就好了。这个时候我们需要两个指针,一个指向数组头部,一个指向数组尾部,平方后比较,把大的放大新数组的尾部即可。

代码

class Solution {
    public int[] sortedSquares(int[] nums) {
        int right = nums.length - 1;
        int left = 0;
        int[] result = new int[nums.length];
        int index = result.length - 1;
        while (left <= right) {
            if (nums[left] * nums[left] > nums[right] * nums[right]) {
                // 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置
                result[index--] = nums[left] * nums[left];
                ++left;
            } else {
                result[index--] = nums[right] * nums[right];
                --right;
            }
        }
        return result;
    }
}

209.长度最小的子数组

我的思路

第一眼看到这题还是暴力的做法,也没有什么想法就暴力从第一个往后加,加到比target大或者相等,然后记录下来,接着从第二个开始往后加,以此类推,最后自然而然的时间超限了,想了半天也没有什么想法,看了讲解后,感觉和毛毛虫很像,用滑动窗口来做,这里的滑动窗口是指加过数就不再重新加了,动态调整字串,我感觉是不是数据有负数,这个做法也是可以实现的?

代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum=0,i=0,j=0,tag=0,ans=1000000,result=0;
        for(j=0;j<nums.length;j++){
            sum+=nums[j];
            if(sum>=target){
                while(sum-nums[i]>=target){
                    sum-=nums[i++];
                }
                result=j-i+1;
                ans=Math.min(result,ans);
            }
            
        }
        if(ans!=1000000)
        return ans;
        else return 0;
    }
}

59.螺旋矩阵II

我的思路

这到题,看到就是模拟,也不想去找什么规律,单纯的模拟,根据现实的做法,分为4个方向,向左,向下,想右,最后向上,然后不断的循环这四个方向,主要还是对限制条件的判断需要想想。

代码

代码写的比较冗长啊,对边界直接就通过有没有填过数来判断了,也不管什么左闭右开的。

class Solution {
    public int[][] generateMatrix(int n) {
        int ans[][]=new int[n][n];
        int i=0,j=0,index=1;
        while(index<=n*n){
            while(j<n &&ans[i][j]==0)
            {  
                ans[i][j]=index++;
                j++;
            }
            j--;
            i++;
            while(i<n&&ans[i][j]==0){
                ans[i][j]=index++;
                i++;
            }
            i--;
            j--;
            while(j>=0&&ans[i][j]==0){
                ans[i][j]=index++;
                j--;
            }
            j++;
            i--;
            while(i>=0&&ans[i][j]==0){
                ans[i][j]=index++;
                i--;
            }
            i++;
            j++;

        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值