题目链接 977. 有序数组的平方
当输入一个有序数组,对数组中每个数进行平方,将得到的结果进行排序。
考虑到,只有当负数平方后可能大于原有序数组的正数的平方和,因此使用双指针的方法,分别指向数组的第一位和最后一位。当左指针小于右指针时进行while()循环,如果左指针的平方大于右指针的平方,则将结果数组的最后一位赋值为左指针的平方;反之同理可得
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length-1;
int left = 0;
int[] result = new int[nums.length];
int index = nums.length-1;
while(left<=right){
if(nums[left]*nums[left]>nums[right]*nums[right]){
result[index]=nums[left]*nums[left];
index--;
left++;
}else{
result[index]=nums[right]*nums[right];
index--;
right--;
}
}
return result;
}
}
题目链接:209. 长度最小的子数组
当然可以采用暴力解法,采用两个循环遍历的方式。
使用双指针方法,在此题里面可以成为滑动窗口法。从left指针开始,向右移动right,当满足条件时,移动left指针,直到不满足条件时,继续向右移动right指针。依次类推下去,求得长度最小的子数组的长度。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int right=0;right<nums.length;right++){
sum += nums[right];
while(sum>=target){
result = Math.min(result,right-left+1);
sum-=nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0:result;
}
}
题目链接 59. 螺旋矩阵 II
这道题和训练营第一天的二分查找方法一样,需要直到左闭右闭和左闭右开的区间写法 。
其次在进行四周的循环时,一定要注意不能漏掉值以及重复值。
class Solution {
public int[][] generateMatrix(int n) {
int res[][] = new int[n][n];
int start = 0;
int i,j;
int count = 1;
int circle = 0;
while(circle++<n/2){
for(j=start;j<n-circle;j++){
res[start][j]=count++;
}
for(i=start;i<n-circle;i++){
res[i][j]=count++;
}
for(;j>=circle;j--){
res[i][j]=count++;
}
for(;i>=circle;i--){
res[i][j]=count++;
}
start++;
}
if(n % 2 == 1){
res[start][start]=count;
}
return res;
}
}