力扣第977道题:有序数组的平方
方法1:暴力解法
具体思路:将数组内的每个元素进行平方,然后按照从小到大的顺序进行排列。
代码如下:
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;
}
};
时间复杂度分析:O(n+nlogn),即:O(nlogn)
方法2:双指针法
问题:什么是双指针?
严格的来说,双指针只能说是是算法中的⼀种技巧。
双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
具体思路:我们发现,题目中有一个条件还没有用到,即:数组的元素是非递减顺序排列的。也就是说,数组元素平方的最大值只会在两端,而不可能是在中间取得。那么我们可以定义i指向数组nums的起始位置,定义j指向数组nums的终止位置。然后,再定义一个新数组result,并让k指向数组result的终止位置。
1)当nums[i] * nums[i] > nums[j] * nums[j]时,将nums[i] * nums[i]赋值给result[k]。k减1,i加1(指针右移)
2)当nums[i] * nums[i] < nums[j] * nums[j]时,将nums[i] * nums[i]赋值给result[k]。k减1,j减1(指针左移)
3)当nums[i] * nums[i] == nums[j] * nums[j]时,将nums[i] * nums[i]或者nums[j] * nums[j]赋值给result[k]都可以,将(3)合并到(1)或者(2)任意一个即可
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
vector<int> result(nums.size(), 0);
//长度为nums.size(),均初始化为0
for(int i = 0, j = nums.size()-1; i <= j;){
//for循环可以同时初始化两个及以上个变量
if(nums[i] * nums[i] > nums[j] * nums[j]){
result[k] = nums[i] * nums[i];
k--;
//等价于:result[k--] = nums[i] * nums[i];
i++;
}
else{
result[k] = nums[j] * nums[j];
k--;
j--;
}
}
return result;
}
};
时间复杂度分析:O(n)