977.有序数组的平方
思路: 双指针
环境: 两边大,中间小,有序
易错点: 加到新的数组中,所以left = right 是最后一个数,要在while中判断
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
vector<int> result;
while(left <= right){
int leftsqr = nums[left] * nums[left] ;
int rightsqr = nums[right] * nums[right];
if(leftsqr >= rightsqr){
result.push_back(leftsqr);
left++;
}else{
result.push_back(rightsqr);
right--;
}
}
reverse(result.begin(),result.end());
return result;
}
};
209.长度最小的子数组
难点: 双指针,滑动窗口
重点: 长度为right - left + 1
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int right = 0;
int result = INT_MAX;
int sum = 0;
for(right = 0; right < nums.size();right++){
sum += nums[right];
while(sum >= target){
result = min(result, right - left + 1);
sum -= nums[left];
left++;
}
}
if(result == INT_MAX) return 0;
return result;
}
};
59.螺旋矩阵II
class Solution {
//难点: 边缘判断
public:
vector<vector<int>> generateMatrix(int n) {
//定义2维,全为0的数组。 n为个数,0为填充物为0
vector<vector<int>> result(n, vector<int>(n, 0));
int count = 1;
int startX = 0;
int startY = 0;
int offset = 1;
int roundCount = 0;
int i,j;
//转圈数
while(roundCount < (int)n/2 ){
i = startX;
j = startY;
for(j = startY; j < n - offset; j++){
result[i][j] = count;
count++;
}
for(i = startX; i < n - offset; i++){
result[i][j] = count;
count++;
}
for(; j > startY; j--){
result[i][j] = count;
count++;
}
for(; i > startX; i--){
result[i][j] = count;
count++;
}
roundCount++;
startX++;
startY++;
offset++;
}
if(n % 2 == 1){
result[startX][startY] = count;
}
return result;
}
};
数组总结
重点考点: 二分法, 双指针,滑动窗口, 模拟行为