一、有序数组的平方
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;
}
};