360. Sort Transformed Array
Given a sorted array of integers nums and integer values a, b and c. Apply a quadratic function of the form f(x) = ax2 + bx + c to each element x in the array.
The returned array must be in sorted order.
Expected time complexity: O(n)
Example 1:
Input: nums = [-4,-2,2,4], a = 1, b = 3, c = 5
Output: [3,9,15,33]
Example 2:
Input: nums = [-4,-2,2,4], a = -1, b = 3, c = 5
Output: [-23,-5,1,7]
方法1: two pointers
思路:
首先判断抛物线的开口向上还是向下,然后用双指针从左右开始,取较大/较小的数字推结果。最后根据a的负号调整result顺序。
class Solution {
public:
vector<int> sortTransformedArray(vector<int>& nums, int a, int b, int c) {
int left = 0, right = nums.size() - 1;
vector<int> result;
while (left <= right) {
if (a >= 0) {
if (calculate(nums[left], a, b, c) >= calculate(nums[right], a, b, c)) {
result.push_back(calculate(nums[left++], a, b, c));
} else {
result.push_back(calculate(nums[right--], a, b, c));
}
}
else {
if (calculate(nums[left], a, b, c) <= calculate(nums[right], a, b, c)) {
result.push_back(calculate(nums[left++], a, b, c));
} else {
result.push_back(calculate(nums[right--], a, b, c));
}
}
}
if (a >= 0) reverse(result.begin(), result.end());
return result;
}
int calculate(int x, int a, int b, int c){
return a * x * x + b * x + c;
}
};