思路:有序数组的平方最大值一定在两端,考虑设置双指针
vector<int> sortedSquares(vector<int>& nums){
int n = nums.size();
//定义一个新数组,用来存每次比较较大的数值,并按题目要求以递增方式存储,要从后往前存
vector<int> ans(n);
//定义双指针,一头一尾,因为是升序排序,所以数组的最大值一定在数组两端
int left = 0,right = n - 1,i = n - 1;
while(left <= right){//当两个指针重叠时,循环结束
if(nums[left]*nums[left] <= nums[right]*nums[right]){
ans[i] = nums[right] * nums[right];
right--;
}else{
ans[i] = nums[left] * nums[left];
left++;
}
i--;
}
return ans;
}
思路:滑动窗口,设置双指针(头指针start,尾指针end),窗口大小从1开始,计算窗口内的sum并与target比较,小于target,窗口大小+1(尾指针+1);大于等于target,窗口大小-1(头指针+1)。记录此时的窗口大小(end - start + 1),取最小值。整个数组遍历过后,如果有符合条件的ans,返回ans,即最小子数组的长度;如果没有符合条件的ans,返回0
int minSubArrayLen(int target, vector<int>& nums){
int n = nums.size();
if(n == 0){
return 0;
}
int ans = INT_MAX;
int sum = 0;
int start = 0, end = 0;
while(end < n){
sum+=nums[end];
while(sum>=target){
ans = min(ans,end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans == INT_MAX? 0 : a
}
思路:模拟循环,循环不变量。需要注意的细节较多,容易疏漏
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 mid = n / 2;//最中间的数字
int count = 1;//填充数字
int offset = 1;//控制边长
int i,j;
while(loop--){
i = startx;
j = starty;
//模拟填充
for(j = starty;j < n - offset;j++){
res[startx][j] = count++;
}
for(i = startx;i < n - offset;i++){
res[i][j] = count++;
}
for(;j > 0;j--){
res[i][j] = count++;
}
for(;i > 0;i--){
res[i][j] = count++;
}
//一圈结束,更新变量
startx++;
starty++;
offset++;
}
if(n % 2 == 0){
res[mid][mid] = count;
}
return res;
}