一、有序数组的平方
1.1暴力解法
可以直接使用C++当时自带的排序算法库函数进行计算,属于暴力解法,复杂度较高,那么有没有运行效率更高的算法思想呢?
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {for(int i=0;i<nums.size();i++){nums[i]*=nums[i];}sort(nums.begin(),nums.end());return nums;}
};
1.2双指针法
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int k=nums.size()-1;int i,j;vector<int> result(nums.size(),0);for(i=0,j=nums.size()-1;i<=j;){if(nums[i]*nums[i]<nums[j]*nums[j]){result[k--]=nums[j]*nums[j];j--;}else{result[k--]=nums[i]*nums[i];i++;}}return result;}
};
二、长度最小的子数组
2.1暴力解法:使用两层for循环进行运算
暴力解法确实可以进行运算,但是当测试的数组很多数字的时候,就超时了
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int result=INT32_MAX;int sum=0;int length=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){length=j-i+1;result=result<length?result:length;break;}}}return result==INT32_MAX?0:result;}
};
2.2使用滑动窗口进行运算
在这里要格外注意为什么使用while(sum>target)而不是if(sum>target)来判断
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int result=INT32_MAX;int sum=0;int i=0;int j=0;int length=0;//子数组的长度for(j=0;j<nums.size();j++){sum+=nums[j];while(sum>=target){length=j-i+1;result=result<length?result:length;sum-=nums[i++];}}return result==INT32_MAX?0:result;}
};
三、螺旋矩阵
在这里主要是我们要提前规定好怎么查询,有规律得查询才能不会发生错误的查询和排序
class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0));int startx=0;int starty=0;int count=1;int offset=1;int loop=n/2;int mid=n/2;int i=0,j=0;while(loop--){i=startx;j=starty;for(j=starty;j<n-offset;j++){res[i][j]=count++;}for(i=startx;i<n-offset;i++){res[i][j]=count++;}for(;j>startx;j--){res[i][j]=count++;}for(;i>startx;i--){res[i][j]=count++;}startx++;starty++;offset++;}if(n%2!=0){res[mid][mid]=count;}return res;}
};