力扣977、209、59题打卡第二天

977题为常规双指针排序题:本题采用两种方法解答,暴力法省去主要探讨双指针做法,其难点在于理解给出的数组为非递减数组。根据此条件可以判断,在数组中的最大数只能位于数组的两端。在此条件下设置双向指针,创建新数组将最大的数一个一个放进来。

代码如下:

        int i = 0;
        int j = nums.length-1;
        int [] fin = new int[nums.length];
        int k = fin.length-1;
        while (i<=j){
            if (nums[i]*nums[i]>=nums[j]*nums[j]){
                fin[k] = nums[i]*nums[i];
                k--;
                i++;
            }else {
                fin[k] = nums[j]*nums[j];
                k--;
                j--;
            }
        }
        return fin;

209题为滑动窗口经典题型:

这个是今天看完视频学会的,核心问题在于进入循环体的是滑动窗口的结束位置,而且在循环里还有一个循环控制滑动窗口的开始位置,感觉不是很高效(有大神会一个循环结束的@我一下)代码如下:

        int i = 0;
        int sum = 0;
        int subL = nums.length+1;
        for (int j=0;j<nums.length;j++){
            sum +=nums[j];
            while (sum>=target){
                if (subL>j-i+1){subL = j-i+1;}
                sum-=nums[i];
                i++;
            }
        }
        if (subL==nums.length){return 0;}
        return subL;

这里有个细节就是初始的subL的设置要大于给定的数组长度,否则不太好控制输出条件。

59题是真的麻烦,看着简单但是做起来还是有难度的。

首先就是设置跳出循环的条件,我就没有想到是转几圈,但是这确实是最好的方法。其次就是进入循环后的坐标设置从左往右以及从右往左的时候不变横坐标,这个也是关键。最后的细节是当给的数为单数时要注意最中间的数需要自己设定。因为我们的代码是左闭右开的。代码如下:

        int [][] fin = new int[n][n];
        int num = 1;
        int count = 0;
        int loop = 0;
        int i,j;
        while (loop++<n/2){
            for (j=count;j<n-loop;j++){
                fin[count][j] = num++;
            }
            for (i=count;i<n-loop;i++){
                fin[i][j] = num++;
            }
            for (;j>=loop;j--){
                fin[i][j] = num++;
            }
            for (;i>=loop;i--){
                fin[i][j] = num++;
            }
            count++;
        }
        if (n%2==1){
            fin[n/2][n/2]=num;
        }
        return fin;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值