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

977.有序数组的平方

leetcode链接
思路: 双指针 因为有序数组中包含负数,让left指针指向原数组的起始位置,right指针指向原数组的终止位置,交替比较两个位置上数据平方的大小,将更大的平方值放入新定义的数组new_nums中。
注意: Java中数组的定义方式

int[ ] new_list = new int[n];

java代码实现:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int len=nums.length;
        int [] new_nums=new int [len];
        int left=0,right=len-1;
        int now=len-1;
        while(now>=0){
            if(nums[left]*nums[left]>nums[right]*nums[right]){
                new_nums[now]=nums[left]*nums[left];
                left++;
            }
            else{
                new_nums[now]=nums[right]*nums[right];
                right--;
            }
            now--;
        }
        return new_nums;
    }
}

时间复杂度:O(n)
空间复杂度:O(n)

209.长度最小的子数组

leetcode链接
思路:滑动窗口(双指针) 两层循环,外层for循环遍历终止位置right,内层while循环移动起始位置left。left和right之间形成一个滑动窗口。每当right向后移动一位,都判断滑动窗口内的数值之和是否满足sum>=target的条件,如果满足,则使用while循环向后移动left指针,直到不满足条件。
注意:

  1. 内层循环要用while循环,不能使用if循环只判断一次。例如当数组为[1,1,1,1,100],target为100时,left要连续移动四次。
  2. 当left指针向后移动前,要记得sum减去nums[left]。
  3. 一些使用时候忘记了的java用法:(1) Integer.MAX_VALUE 最大整型数,不要忘了写Integer.。(2)Math.min(a,b)不要忘了写Math,且首字母时大写的(因为是Java里的类啊!!!)。
    java代码实现:
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0 , right = 0 ;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for(right=0;right<nums.length;right++){
            sum+=nums[right];
            while(sum>=target){
                result=Math.min(result,right-left+1);
                sum-=nums[left];
                left++;
                
            }
        }
        return result==Integer.MAX_VALUE?0:result;

时间复杂度:O(n):(这里不要单纯认为两层循环就是n^2,要看每个元素具体被遍历了几次,这里是两次,所以是2*n)
空间复杂度:O(1)

59.螺旋矩阵II

leetcode链接
**思路:**最重要的是弄清楚每一条边的开闭区间。总共需要遍历n/2圈(若n是奇数则最后直接将一个数据插入矩阵的中心),每一圈需要遍历四条边,注意每一条边都是一个左闭右开的区间!需要强调循环不变量是每一圈的遍历方法:先明确起始位置(start_x,start_y),然后明确每条边的终止位置n-offset(之所以是一个变量是因为每一圈的边长都不同,终止位置依次减少一个,所以offset每一圈循环后++)。然后再依次填入四条边。
注意:(1)要特别考虑n为奇数的情况。(2)offset别忘了也要++。
在这里插入图片描述
java代码实现:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix=new int[n][n];
        int start_x=0,start_y=0;//每一圈的起始位置
        int offset=1;//每一条边遍历的长度
        int count=1;//当前插入的数值
        int i=0,j=0;//循环变量
        int loop=0;//控制总圈数的变量
        while(loop++<n/2){
            for(j=start_y;j<n-offset;j++){
                matrix[start_x][j]=count++;
            }
            for(i=start_x;i<n-offset;i++){
                matrix[i][j]=count++;
            }
            for(;j>start_y;j--){
                matrix[i][j]=count++;
            }
            for(;i>start_x;i--){
                matrix[i][start_y]=count++;
            }
            start_x++;
            start_y++;
            offset++;
        }
        if(n%2==1){//如果n是奇数,最后一个数据直接插入到中间
            matrix[start_x][start_y]=count;
        }
        return matrix;
    }
}

时间复杂度:O(n^2)
空间复杂度:O(n^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值