提示:以下是本篇文章正文内容,下面案例可供参考
1.自己的暴力解法
无
2.自己的进阶解法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
if (nums.size() == 1)
{
nums[0] = nums[0] * nums[0];
return nums;
}
int midsum = 99999999, mid = 0;
for (int i = 0; i < nums.size(); ++i)
{
if (abs(nums[i]) < midsum)
{
midsum = abs(nums[i]);
mid = i;
}
}
// cout << midsum;
// cout << mid;
if (mid == 0)
{
for (int i = 0; i < nums.size(); ++i)
{
nums[i] = nums[i] * nums[i];
}
return nums;
}
if (mid == nums.size() - 1)
{
vector<int> v;
for (int i = nums.size() - 1; i >= 0; --i)
{
v.push_back(nums[i] * nums[i]);
}
return v;
}
int l = mid - 1, r = mid + 1;
vector<int> v;
v.push_back(nums[mid] * nums[mid]);
while (l >= 0 && r < nums.size())
{
if (abs(nums[l]) == abs(nums[r]))
{
v.push_back(nums[l] * nums[l]);
v.push_back(nums[r] * nums[r]);
--l, ++r;
}
else if (abs(nums[l]) < abs(nums[r]))
{
v.push_back(nums[l] * nums[l]);
--l;
}
else if (abs(nums[l]) > abs(nums[r]))
{
v.push_back(nums[r] * nums[r]);
++r;
}
}
while (l >= 0)
{
v.push_back(nums[l] * nums[l]);
--l;
}
while (r < nums.size())
{
v.push_back(nums[r] * nums[r]);
++r;
}
return v;
}
};
3.自己的库函数解法
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;
}
};
4.题解的进阶解法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
int negative = -1;
for (int i = 0; i < n; ++i) {
if (nums[i] < 0) {
negative = i;
} else {
break;
}
}
vector<int> ans;
int i = negative, j = negative + 1;
while (i >= 0 || j < n) {
if (i < 0) {
ans.push_back(nums[j] * nums[j]);
++j;
}
else if (j == n) {
ans.push_back(nums[i] * nums[i]);
--i;
}
else if (nums[i] * nums[i] < nums[j] * nums[j]) {
ans.push_back(nums[i] * nums[i]);
--i;
}
else {
ans.push_back(nums[j] * nums[j]);
++j;
}
}
return ans;
}
};
作者:LeetCode-Solution
来源:力扣(LeetCode)
5.题解的超级进阶解法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n);
for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
ans[pos] = nums[i] * nums[i];
++i;
}
else {
ans[pos] = nums[j] * nums[j];
--j;
}
--pos;
}
return ans;
}
};
作者:LeetCode-Solution
来源:力扣(LeetCode)
6.总结
有些精巧的设计可以减少甚至避免复杂的讨论,长见识了。