今日内容
977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
有序数组的平方
解题思路
- 主要使用双指针的方法,i指向起始位置,j指向终止位置;
- 比较平方的值,较大的存在数组后,left>right结束
实现
Java
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
int left = 0, right = nums.length-1;
int index = nums.length-1;
while(left<=right){
if(nums[left]*nums[left]<=nums[right]*nums[right]){
res[index]=nums[right]*nums[right];
index--;
right--;
}
else{
res[index]=nums[left]*nums[left];
index--;
left++;
}
}
return res;
}
}
C++
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size()-1;
vector<int> res(nums.size(),0);
for(int i=0,j=nums.size()-1;i<=j;){
if(nums[i]*nums[i] < nums[j]*nums[j]){
res[k--] = nums[j]*nums[j];
j--;
}
else{
res[k--] = nums[i]*nums[i];
i++;
}
}
return res;
}
};
长度最小的子数组
解题思路
- 使用滑动窗口解决,数组索引作为窗口的尾指针,当sum值大于target,记录子数组长度,更新结果并头指针右移,sum更新减去nums[i]
实现
Java
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res = Integer.MAX_VALUE;
int left = 0, sum = 0;
for(int right = 0; right < nums.length; right++){
sum += nums[right];
while(sum >= target){
res = Math.min(res,right-left+1);
sum -= nums[left];
left++;
}
}
return res == Integer.MAX_VALUE ? 0 : res;
}
}
C++
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int res = INT32_MAX;
int sum = 0;
int length = 0;
int i = 0;
for(int j=0;j<nums.size();j++){
sum += nums[j];
while(sum>=target){
length = j - i + 1;
res = length < res ? length : res;
sum -= nums[i++];
}
}
return res == INT32_MAX ? 0 : res;
}
};
螺旋矩阵II
解题思路
- 注意处理原则,代码里处理的原则也是统一的左闭右开
- 循环的次数是loop=n/2,奇数的情况中间留了最后一个,正方形矩阵使用一个start也可以,xy方便理解
- 当 while() 中的条件值为 0 时,循环就结束了
实现
Java
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;
}
}
C++
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int loop = n/2;
int offset = 1;
int i,j;
int startx = 0, starty = 0;
int count = 1;
int mid = n/2;
while(loop--){
i = startx;
j = starty;
for(j = starty;j < n-offset;j++){
res[startx][j] = count++;
}
for(i = startx;i < n-offset;i++){
res[i][j] = count++;
}
for(;j > starty;j--){
res[i][j] = count++;
}
for(;i > startx;i--){
res[i][j] = count++;
}
startx++;
starty++;
offset++;
}
if(n%2==1){
res[mid][mid] = count;
}
return res;
}
};