赞
踩
(1)暴力列举法,时间复杂度为 O(n×n)
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;
}
};
(2)双指针法时间复杂度为 O(n)
class Solution { public: vector<int> sortedSquares(vector<int>& nums) { int right=nums.size()-1; int flag=nums.size()-1; int length=nums.size(); vector<int>result(length,0); for(int left=0,right=length-1;left<=right;) { if(nums[left]*nums[left]>nums[right]*nums[right]) { result[flag--]=nums[left]*nums[left]; left++; } else { result[flag--]=nums[right]*nums[right]; right--; } } return result; } };
(1)暴力解法:时间复杂度 O(n×n)
//暴力列举法 class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int sum=0; int result=INT32_MAX;//代表32位有符号最大值,这是C++中宏定义 int minlength=0;//子序列长度 for(int i=0;i<nums.size();i++)//子序列起始位置从i { sum=0;//每遍历一次循环sum值要重新归零 for(int j=i;j<nums.size();j++)//子序列终止位置从j { sum+=nums[j]; if(sum>=target) { minlength=j-i+1; result=result<minlength ?result:minlength; break;//跳出循环,已经找到所寻找的子序列 } } } return result==INT32_MAX?0:result;//没有被赋值的话就返回零否则就是所求子序列的长度 } };
(2)双指针法:时间复杂度 O(n)
//双指针法也为滑动窗口法 class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int i=0;//慢指针 int sum=0;//子数组和 int result=INT32_MAX; int sublength=0;//滑动窗口长度大小,也即子序列长度 for(int j=0;j<nums.size();j++)//快指针 { sum+=nums[j]; while(sum>=target)//这里不能用if而是用while,是因为如果sum值一直大于target就可以继续慢指针移动 { sublength=j-i+1; sum=sum-nums[i++]; result=result<sublength?result:sublength; } } return result==INT32_MAX?0:result;//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 loop=n/2;//要进行的循环遍历圈数 int offset=1;//需要控制的每遍历完一圈要收缩一位 int count=1;//给数组元素赋值的 int mid=n/2;//对n为奇数特殊情况,另外处理最后一圈剩余的单独数组元素赋值 int i,j; while(loop--) { i=startx; j=starty; //模拟填充上行从左到右(左闭右开) for( j=starty;j<n-offset;j++)//在这里切勿使用for(int j=starty;j<n-offset;j++) 不然在循环中声明了int j,那么它将会覆盖外部的j { res[startx][j]=count++; } //模拟填充右列从上到下(满足上闭下开) for( i=startx;i<n-offset;i++) { res[i][j]=count++; } //模拟填充下行从右到左(满足右闭左开) for(;j>starty;j--)//这里的j是继承前面的j的值所以不需要再重新赋值,同理下面的for循环里的i { res[i][j]=count++; } //模拟填充左列从下到上(满足下闭上开) for(;i>startx;i--) { res[i][j]=count++; } startx++; starty++; offset+=1; } //给n为奇数情况最后剩余的中间位置单独赋值 if(n%2) { res[mid][mid]=count; } return res; } };
总结:在写代码时候区别:for( j=starty;j<n-offset;j++)与for(int j=starty;j<n-offset;j++)差异
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。