977:有序数组的平方
思路:遍历数组将所有值平方后的值重新覆盖数组,然后进行排序。
双指针法
vector<*int*> sortedSquares(vector<*int*>& *nums*) {
*int* val;
*int* j;
for(*int* i=0;i<nums.size();i++){
val=nums[i]*nums[i];
nums[j++]=val;
}
sort(nums.begin(),nums.end());
return nums;
}
209:长度最小的子数组
滑动窗口
思路:先遍历数组,找到加起来大于或等于target的j个总和为sum的数,确定区间后用另一个指针缩小窗口,直到找到总和长度最小的子数组。
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int sublength=0;
int i=0;//起始位置
int result=INT32_MAX;//最终最小长度/返回值
for(int j=0;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
sublength=j-i+1;
result = result < sublength ? result : sublength;
sum-=nums[i];
i++;
}
}
return result == INT32_MAX ? 0 : result;
}
59:螺旋矩阵
思路:用四个循环依次确定一圈的值,区间确定为左闭右开[i,j)。转一圈后startX、startY、offset都要+1缩圈继续确定每一圈的值。如果是偶数就正常进行循环确定值;如果是奇数就用n%2!=0最后给中间的值单独赋值。
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> nums(n, vector<int>(n, 0));
int startX=0;
int startY=0;
int count=1;
int offset=1;
int i,j;
int loop=n/2;
int mid=n/2;
while(loop--){
for(i=startY;i<n-offset;i++){
nums[startX][i]=count++;
}
for(j=startX;j<n-offset;j++){
nums[j][i]=count++;
}
for(j;j>startY;j--){
nums[i][j]=count++;
}
for(i;i>startX;i--){
nums[i][j]=count++;
}
startX++;
startY++;
offset+=1;
}
if(n%2!=0){
nums[mid][mid]=count;
}
return nums;
}
数组篇总结
数组是存放在连续内存空间上的相同类型数据的集合。
数组的索引从0开始。
常用方法:
1、双指针
- 暴力解法时间复杂度:O(n^2)
- 双指针时间复杂度:O(n)
2、二分法
- 暴力解法时间复杂度:O(n)
- 二分法时间复杂度:O(logn)
3、滑动窗口
- 暴力解法时间复杂度:O(n^2)
- 双指针时间复杂度:O(n)