Leetcode 977 Squares of a Sorted Array
brute force
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0; i < nums.size();i++){
nums[i] = pow(nums[i], 2);
}
sort(nums.begin(), nums.end());
return nums;
}
};
时间复杂度:O(n+nlogn)
2. 双指针法
public:
vector<int> sortedSquares(vector<int>& nums) {
int size = nums.size();
int i = 0, j = size-1;
int p = size-1;
vector<int> res (size, 0);
while(i <= j){
if(abs(nums[i]) < abs(nums[j])){
res[p] = pow(nums[j], 2);
j--;
}else{
res[p] = pow(nums[i], 2);
i++;
}
p--;
}
return res;
}
题目中给出是一个“有序”的数组, 所以最大的值一定从两端开始(可以视为两个从大到小的数组),所以可以用两个指针分别从头尾开始,比较大小填入新的数组中。
时间复杂度: O(n)
Leetcode 209
滑动窗口
两个指针分别指向窗口的两端,根据要求维护窗口大小
【题目中的提示】连续的一段子集[subarray]
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0, right = 0, sum = 0;
int res = INT_MAX;
while(right < nums.size()){
sum += nums[right];
right ++;
while(sum >= target){
res = min(res, right-left);
sum -= nums[left];
left ++;
}
}
return res == INT_MAX ? 0 : res;
}
第一次出现的问题:
最后的返回值写了right - left +1, 注意到在用到right的时候right的值; 没有写return 0的情况
*如果数组中存在负数,可能没办法使用滑动窗口方法
Leetcode 59
Spiral Matrix II
螺旋数组
每一条边遍历一定要遵循同样的原则(这一题用的是左闭右开)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int> (n,0));
int startx = 0, starty =0;
int loop = n/2;
int count =1;
int mid = n/2;
int offset = 1;
int i =0 ,j = 0;
while(loop--){
i = startx;
j = starty;
for(j = starty; j< n-offset; j++){
res[i][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 it is odd, the middle of the matrix should be added manually
if(n%2){
res[mid][mid] = count;
}
return res;
}
};
注意的点:
对于vector<vector>的理解
对于loop的理解(每次遍历会上下左右各经过一次,所以对于每一行来说经过了两个值,所以/2)
如果是奇数,中间的值要在最后补上
while里面一定要先对i,j赋值:1)如果只在开始写i=0, 在经过第二次循环的时候i还是0,会从第一行重新开始赋值 2)如果只写i, 第一遍的循环的时候i是没有初始值的, 所以第一行始终是0
总结
数组常见方法:二分查找(用left和right从中间处缩小查找范围)O(logn)
双指针法(快慢指针,从两边向中间的指针,滑动窗口)O(n)
一些遍历(一定要遵循一定的规则)