977.有序数组的平方
思路:双指针从左右两侧向中间迭代,定义一个新数组result(与nums数组长度相同),定义新数组的指针在最右侧(因为平方之后大的数字要放在最右边),比较平方后的元素值大小,如果右侧的元素平方后更大,就将此值放到新数组index的位置,然后index左移一位,同时right也左移一位;同理如果左侧元素平方后更大,同样将该值放到index位置,index左移一位,同时left右移一位。返回result数组。
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int[] result = new int[nums.length];//定义一个长度相同的新数组
int index = result.length - 1;//新数组的指针从右往左更替
while(left <= right){
if(nums[left]*nums[left] < nums[right]*nums[right]){
result[index] = nums[right]*nums[right];
index--;
right--;
}
else{
result[index] = nums[left]*nums[left];
index--;
left++;
}
}
return result;
}
}
209.长度最小的子数组
int result = Integer.MAX_VALUE
- Integer.MAX_VALUE表示:int 数据类型的最大值,即:2147483647
- Integer.MIN_VALUE表示: int数据类型的最小值,即:-2147483648
思路:设置两个指针起始点均为左侧,right先开始移动,此时sum开始累加每个right值,直到sum大于等于target值。说明此子数组的长度符合要求,即right - left + 1;此时需要向右移动left指针,sum值发生改变,即sum = sum - nums[left];然后left++,再回到for循环。
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];
left++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
59.螺旋矩阵Ⅱ
思路:绕圈填写,左闭右开(有点乱,需再看)
class Solution {
public int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
int startX = 0,startY = 0;
int offset = 1;
int count = 1;
int loop = 1;
int i,j;
while(loop <= n/2){
for(j = startY;j < n - offset;j++){
nums[startX][j] = count++;
}
for(i = startX;i < n - offset;i++){
nums[i][j] = count++;
}
for(;j > startY;j--){
nums[i][j] = count++;
}
for(;i > startX;i--){
nums[i][j] = count++;
}
offset++;
loop++;
startX++;
startY++;
}
if(n%2 == 1){
nums[startX][startY] = count;
}
return nums;
}
}