360. Sort Transformed Array

题目链接:https://leetcode.com/problems...

这是个数学问题,抛物线,我们知道

  1. a > 0: 这时候是个凹函数,两遍的值大于中间,所以从两遍开始哪边的大就把结果放到result的右边

  2. a < 0: 这时候是个凸函数,两遍的值小于中间,所以两遍开始扫哪边的值小就把它放到result的左边

  3. a == 0: 这时候是单调增的函数,用上面任意一种方法都可以。

public class Solution {
    public int[] sortTransformedArray(int[] nums, int a, int b, int c) {
        int n = nums.length;
        // 2 points
        int i = 0, j = n - 1;
        int k = a > 0 ? n - 1 : 0;
        
        int[] res = new int[n];
        while(i <= j) {
            int left = getF(nums[i], a, b, c);
            int right = getF(nums[j], a, b, c);
            if(a > 0) {
                if(left > right) {
                    res[k--] = left;  i++;
                }
                else {
                    res[k--] = right;  j--;
                }
            }
            else {
                if(left < right) {
                    res[k++] = left;  i++;
                }
                else {
                    res[k++] = right;  j--;
                }
            }
        }
        
        return res;
    }
    
    private int getF(int x, int a, int b, int c) {
        return a * x * x + b * x + c;
    }
}

lulouch13
13 声望6 粉丝