977.有序数组的平方
因为题目给得数组是升序排序的,代表最大的平方数一钉出现在左右边,然后越往中间越小。所以我们运用双指针来判断左右两边谁比较大然后往中间遍历。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
int count = nums.size() - 1;
vector<int> result(nums.size(), 0);
while(count >= 0){
int leftNum = nums[left] * nums[left];
int rightNum = nums[right] * nums[right];
if(leftNum >= rightNum){
result[count--] = leftNum;
left++;
}
else{
result[count--] = rightNum;
right--;
}
}
return result;
}
};
209.长度最小的子数组
滑动窗口。运用快和慢两个指针来制造滑动窗口,移动快指针来制造窗口的最右,在移动慢指针找看看窗口能够缩到多小。将最小值存起来作比较即可得到结果。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int i = 0, sum = 0;
for(int j = 0; j<nums.size();j++){
sum += nums[j];
while(sum >= target){
int length = j - i +1;
result = min(result, length);
sum -= nums[i];
i++;
}
}
return result == INT32_MAX ? 0 : result;
}
};
59.螺旋矩阵II
考验观察力。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n,0));
int startx = 0, starty = 0;
int loop = n / 2;
int offset = 1;
int count = 1;
while(loop --){
int i = startx, j = starty;
for(; j < n - offset; j++){
result[startx][j] = count++;
}
for(; i < n - offset; i++){
result[i][j] = count++;
}
for(; j > starty; j--){
result[i][j] = count++;
}
for(; i > startx; i--){
result[i][j] = count++;
}
startx ++;
starty ++;
offset ++;
}
if(n%2 == 1){
result[n/2][n/2] = count;
}
return result;
}
};