977:这题双指针控制一左一右
这个注意fast不能直接赋给res,因为两个作用于不同的数组
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res(nums.size(), 0);
int slow = 0;
int fast = nums.size() - 1;
int k = fast;
while (fast >= slow) {//最后会相等
if (nums[fast] * nums[fast] > nums[slow] * nums[slow]) {
res[k--] = nums[fast] * nums[fast];
fast--;
}
else {
res[k--] = nums[slow] * nums[slow];
slow++;
}
}
return res;
}
209:这题要注意sum的位置
int minSubArrayLen(int target, vector<int>& nums) {//暴力解法,
int length = INT32_MAX, sum = 0, count = 0;
for (int i = 0; i < nums.size(); i++) {
sum = 0;
for (int j = i; j < nums.size(); j++) {
sum += nums[j];
if (sum >= target) {
count = j - i + 1;
length = length > count ? count : length; //判断谁更短
break;
}
}
}
return length == INT32_MAX ? 0 : length;
}
int minSubArrayLen(int target, vector<int>& nums) {
//滑动窗口是根据终止位置来确定..不可能想得到啊
int length = INT32_MAX;
int sum=0;
int i = 0;
for (int j = 0; j < nums.size(); j++) {
//int sum = 0;//不能放这里:没有大于tar但也在目标里
sum += nums[j];
while (sum >= target) {
int count=j-i+1;
length = length >count?count:length;
sum-=nums[i++];
}
}
return length==INT32_MAX?0:length;
}
59:问就是不会,这么多变量根本想不到
vector<vector<int>> generateMatrix(int n) {//这题按照转圈逻辑写
vector<vector<int>> arr(n,vector<int>(n,0));//
int start=0,offset=1,i,j,count=1,k=n/2;//因为k一圈转两边一左一右
while(k--){//因为当k大于0说明还有圈
for(i=start;i<n-offset;i++){
arr[start][i]=count++;
}
for(j=start;j<n-offset;j++){
arr[j][i]=count++;//这里i不应该是倒数第二个位置么。。。因为当j==最左侧的才退出条件,并不会重置掉
}
for(;i>start;i--){
arr[j][i]=count++;
}
for(;j>start;j--){
arr[j][i]=count++;
}
start++;
offset++;
}
if(n%2==1){
arr[n/2][n/2]=n*n;
}
return arr;
}