977.有序数组的平方
看见题目的第一反应就是暴力解法,挨个平方之后排序
class Solution {
/**
* 非递减顺序排列的数组中将每个数平方后排序
* @param nums
* @return
*/
public int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i]*=nums[i];
}
Arrays.sort(nums);
return nums;
}
}
但如果说要用双指针我就很懵,双指针?slow和fast的话两者是什么意义?想了一下还是没想通最后索性去看讲解了 有序数组平方讲解
如果一个数组有序,包含负数的话,平方之后最大数的出现肯定是原始数组两端的数,然后两指针逐渐往中间缩。
当然这还有一个前提就是,不去合并平方后的值相同的情况。当然就算要合并,也变成移除数组相同元素的题了。
class Solution {
/**
* 双指针方法,left和right比较,谁大谁先放在新数组后面
* @param nums
* @return
*/
public int[] sortedSquares(int[] nums) {
int[] arr=new int[nums.length];
int left=0,right= nums.length-1;
for (int i = arr.length-1; i >=0 ; i--) {
int templeft=nums[left]*nums[left];
int tempright=nums[right]*nums[right];
arr[i]=templeft>tempright?nums[left]*nums[left++]:nums[right]*nums[right--];
}
return arr;
}
}
left和right比较,谁大谁先放在新数组后面,然后该指针往中间移动
209.长度最小的子数组
利用双指针缩窗口里面的值看是否满足条件(本题中是和值>=target)
right指针一直外扩,扩到符合条件的时候去缩left指针
class Solution {
/**
* 滑动数组--长度最小的子数组
* @param target
* @param nums
* @return
*/
public int minSubArrayLen(int target, int[] nums) {
int left=0,right=0;//滑动数组的边界
int ans=Integer.MAX_VALUE;
int sum=0;
for (int i = 0; i < nums.length; i++) {
sum+=nums[i];
}
//处理极端情况,数组里面所有值加起来还比target小
if(sum<target){
return 0;
}
sum=0;
while (right< nums.length){
sum+=nums[right];
while (sum>=target){
ans=ans<(right-left+1)?ans:(right-left+1);
sum-=nums[left];
left++;
}
right++;
}
return ans;
}
}
59.螺旋矩阵II
一开始是没有思路的,包括去听了讲解,在coding方面之后还要多轮几次
class Solution {
/**
* 顺时针填入数(坚持左闭右开)明确区间
* @param n
* @return
*/
public int[][] generateMatrix(int n) {
int [][]ans=new int[n][n];
int number=1;//填入的数据
int loop=1;//转圈
int startx=0,starty=0;
int i=0,j=0;
while(loop<=n/2){
for( j=starty;j<n-loop;j++){
ans[startx][j]=number++;
}
for (i = startx; i <n-loop ; i++) {
ans[i][j]=number++;
}
for(j=n-loop;j>startx;j--){
ans[i][j]=number++;
}
for (i =n-loop; i >starty; i--) {
ans[i][j]=number++;
}
loop++;
startx++;
starty++;//缩圈
}
if(n%2!=0){
ans[n/2][n/2]=number;
}
return ans;
}
}
感觉在写的时候还是对照一下绕的表,可能会把各种变量的含义搞的更清楚。