题目链接:LeetCode977:有序数组的平方
思路:这道题目在于加深双指针法的理解,双指针可以是“快慢”指针从一头开始遍历,也可以是分别从两头开始遍历;这个题目是有序数组,那么可以将双指针分别定在数组的首尾,首尾元素取平方后比较将较大值放入新数组尾端,同时移动原数组中指针的位置;
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int ans = nums.length - 1;
// 定义一个新的数组大小与原数组一样
int[] result = new int[nums.length];
while(left <= right) {
// 比较首尾指针对应元素的平方值,并移动指针位置
if(nums[right] * nums[right] >= nums[left] * nums[left]) {
result[ans] = nums[right] * nums[right];
right --;
} else {
result[ans] = nums[left] * nums[left];
left ++;
}
ans --;
}
return result;
}
}
题目链接:LeetCode209:长度最小的子数组
思路:这道题目在于滑动窗口方法的掌握,在给定的数组中获取元素和大于等于目标值的最小子数组;定义两个指针left、right,先移动right指针,计算其累加值与target比较,当累加值大于等于target时,固定right指针位置,移动left,并在累加值中减去left走过的元素,直到累加值符合小于目标值条件;重复上述移动,直到right指针到达数组尾部,在移动过程中,每当符合类加值大于等于target时,记录(right-left+1)大小;
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int sum = 0;
int res = Integer.MAX_VALUE;
for(int right = 0; right < nums.length; right ++) {
sum += nums[right];
while(sum >= target) {
res = Math.min(res, right - left + 1);
sum -= nums[left++];
}
}
return res == Integer.MAX_VALUE ? 0 : res;
}
}
题目链接:LeetCode59:螺旋数组 II
思路:这个题目只要固定好起点和终止调节,从左到右,从上到下,绕圈打印即可;
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0;
int[][] res = new int[n][n];
int start = 0;
int count = 1;
int i, j;
while(loop++ <n/2) {
for(j=start;j<n-loop;j++){
res[start][j]=count++;
}
for(i=start;i<n-loop;i++){
res[i][j]=count++;
}
for(;j>=loop;j--){
res[i][j]=count++;
}
for(;i>=loop;i--){
res[i][j]=count++;
}
start++;
}
if(n%2 == 1){
res[start][start] = count;
}
return res;
}
}