目录
977.有序数组的平方
力扣:给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
双指针法
1、为什么可以用双指针法:原数组是非递减顺序的
2、代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
//双指针法
int left=0, right=nums.size()-1;
vector<int> result(nums.size(),0);
int k = nums.size()-1;
while(left<=right)
{
if(nums[left]*nums[left]>=nums[right]*nums[right])
{
result[k] = nums[left]*nums[left];
left++;
}
else
{
result[k] = nums[right]*nums[right];
right--;
}
k--;
}
return result;
}
暴力排序
数组每一个数平方得到新数组然后用sort()函数排序
sort函数:底层快排,在此处贴一下快排作复习
void quick_sort(vector<int>& a, int l ,int r)
{
if(l>=r) return;
int t=(a[l]+a[r])/2;
int i=l-1,j=r+1;
while(i<j)
{
do i++; while(a[i]<t);
do j--;while(a[j]>t);
if(i<j) swap(a[i],a[j]);
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
209.长度最小的子数组
力扣:给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
双指针+滑动窗口
1、关键:两个指针的定义
①外层循环的指针是滑动窗口末端
②内存循环的指针是滑动窗口首端
2、最大值表示:INT32_MAX
3、return result == INT32_MAX ? 0 : result ;
4、时间复杂度O(n)
5、代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int front = 0, back = 0;
int sum=0, result=INT32_MAX;
for(;back<nums.size();back++)
{
sum+=nums[back];
while(sum>=target)
{
result = min(result, back-front+1);
sum -= nums[front];
front++;
}
}
return result==INT32_MAX? 0 : result;
}
};
暴力解法
如果有两层for循环,break和continue一样只跳出内层for循环。break和continue一样只会跳出离它最近的一层循环。
59.螺旋矩阵II
2、关键:坚持循环不变量原则,以及边界条件的处理。根据该原则模拟顺时针画矩阵的过程:
填充上行从左到右,填充右列从上到下,填充下行从右到左,填充左列从下到上
3、边界条件处理—代码实现:
①总循环:转的圈数(如果n为奇数,还要填充螺旋矩阵中间位置)
②起点(startx,starty)、 螺旋矩阵当前点(i,j)、终点 n-offset (每一圈后的偏移量offset)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n,vector<int> (n,0));
int startx = 0, starty = 0;
int offset = 1;
int count = 1;
//圈数
int circle = 0;
while(circle < n/2)
{
int i = startx,j=starty;
for(;j<n-offset ; j++)
{
result[startx][j] = count;
count ++;
}
for(; i<n-offset ; i++)
{
result[i][j] = count;
count ++;
}
for(; j>starty ;j--)
{
result[i][j] = count;
count ++;
}
for(; i>startx ;i--)
{
result[i][j] = count;
count ++;
}
offset++;
startx++;
starty++;
circle++;
}
if(n%2==1) result[n/2][n/2]=count;
return result;
}
};