360-sort-transformed-array
Question
https://leetcode.com/problems/sort-transformed-array/description/
Given a sorted array of integersnumsand integer valuesa,bandc. Apply a quadratic function of the form f(x) =ax2+bx+cto each elementxin the array.
The returned array must be in sorted order.
Expected time complexity: O(n)
Example:
nums = [-4, -2, 2, 4], a = 1, b = 3, c = 5,
Result: [3, 9, 15, 33]
nums = [-4, -2, 2, 4], a = -1, b = 3, c = 5
Result: [-23, -5, 1, 7]
Thought Process
- Two Pointers
- Start from the end of the array, the value is either the max or min depends on the value of a
- If a is positive the, the curve is concave upward, the max is on the edges
- Otherwise, the curve is concave downward, the min is on the edge
- Time complexity O(n)
- Space complexity O(n) or O(1) extra
Solution
class Solution {
public int[] sortTransformedArray(int[] nums, int a, int b, int c) {
int n = nums.length;
int[] res = new int[n];
int i = 0, j = n - 1, index = a >= 0 ? j : i;
while (i <= j) {
int left = cal(a, b, c, nums[i]);
int right = cal(a, b, c, nums[j]);
if (a >= 0) {
if (left >= right) {
res[index--] = left;
i++;
} else {
res[index--] = right;
j--;
}
} else {
if (left <= right) {
res[index++] = left;
i++;
} else {
res[index++] = right;
j--;
}
}
}
return res;
}
private int cal(int a, int b, int c, int x) {
return a * x * x + b * x + c;
}
}