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指针,直到不满足条件。
注意:
- 内层循环要用while循环,不能使用if循环只判断一次。例如当数组为[1,1,1,1,100],target为100时,left要连续移动四次。
- 当left指针向后移动前,要记得sum减去nums[left]。
- 一些使用时候忘记了的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)