Sort Transformed Array

題目連結:

https://leetcode.com/problems/sort-transformed-array/

題意:

給定一個有序陣列與A, B, C三值,將陣列中每個元素套入Quadratic function 即$$f(x) = ax^2 + bx + c$$,並將結果以遞增方式表示。

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]

解題思路:

Option 1:

最簡單的方法即是將每個數算出來並排序,但需耗費$$O(NlogN)$$時間。

Option 2:

數學解法,可惜數學不好沒想到,參考了網上教學後得知以下規則

  • 若$$a > 0$$ ,則是個開口向上的曲線,所以絕對值越大的數則得出的數越大,我們可以由後往前寫result陣列。
  • 若$$a > 0$$,則是個開口向下的曲線,所以絕對值越大的數則得出來的數越小,我們可以由前往後寫result陣列。
  • 若$$a = 0$$,則是個單調遞增的數,往前或往後寫都沒差,可以和上面其中一個case 合併。

程式碼如下:

class Solution {
    public int[] sortTransformedArray(int[] nums, int a, int b, int c) {
        if (nums == null) {
            return nums;
        }

        int length = nums.length;
        int[] result = new int[length];
        int left = 0;
        int right = length - 1;

        if (a > 0) {
            int cur = length - 1;
            while (left <= right) {
                if (quadraticFunction(nums[left], a, b, c) > quadraticFunction(nums[right], a, b, c)) {
                    result[cur--] = quadraticFunction(nums[left], a, b, c);
                    left++;
                } else {
                    result[cur--] = quadraticFunction(nums[right], a, b, c);
                    right--;
                }
            }
        } else {
            int cur = 0;
            while (left <= right) {
                if (quadraticFunction(nums[left], a, b, c) < quadraticFunction(nums[right], a, b, c)) {
                    result[cur++] = quadraticFunction(nums[left], a, b, c);
                    left++;
                } else {
                    result[cur++] = quadraticFunction(nums[right], a, b, c);
                    right--;
                }
            }
        }

        return result;
    }

    public int quadraticFunction(int val, int a, int b, int c) {
        int result = a * (val * val) + val * b + c;
        return result;
    }
}
Reference:

results matching ""

    No results matching ""