LeetCode 977.双指针,个人感觉主要是对题目的理解,非递减顺序 排序的整数数组,所以每次平方的最大值不是在前面就是在后面,所以用两个指针一个left从0开始,另一个right从最后一个元素开始。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size());
int left=0;int right=nums.size()-1;
for(int i=right;i>=0;--i){
if((long)nums[left]*nums[left]<(long)nums[right]*nums[right]){
result[i]=nums[right]*nums[right];
right--;
}else{
result[i]=nums[left]*nums[left];
left++;
}
}
return result;
}
};
209,还是审题,要找的是长度最小的 连续子数组,所以滑动窗口也就不难理解了。
逻辑有了,代码能力还是得练!
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=INT32_MAX;
int sum=0;
int left=0;
int WindowSize=0;
for(int right=0;right!=nums.size();++right){
sum+=nums[right];
while(sum>=target){
WindowSize=right-left+1;
result=(result<WindowSize)?result:WindowSize;
sum-=nums[left++];
}
}
result=(result<INT32_MAX)?result:0;
return result;
}
};
59.转圈圈,写的复杂,转的圈数是n/2;每一圈下来,四个循环的条件都是会变化的。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
if(n==1) return vector<vector<int>>{{1}};
vector<vector<int>> res(n,vector<int>(n,0));
int x1=0;
int y1=0;
int cnt=1;
int q=n/2;
int l=n-1;
int r=0;
while(q--){
for(;y1<l;++y1){
res[x1][y1]=cnt++;
}
for(;x1<l;++x1){
res[x1][y1]=cnt++;
}
for(;y1>r;--y1){
res[x1][y1]=cnt++;
}
for(;x1>r;--x1){
res[x1][y1]=cnt++;
}
x1++;
y1++;
l--;
r++;
}
if(n%2){
res[x1][y1]=cnt;
}
return res;
}
};