/* * 360. Sort Transformed Array * 2016-7-14 by Mingyang * 这个题目吧一开始还做错了,一看就是初中数学没学好,抛物线定理,a大于0像上嘛,肯定两边相比最大的就最大嘛 * 再看看a小于0的时候,向下,那么就是两边相比最小的肯定最小 * 自己一开始只考虑了a为0的情况。 * 另外参考了大神的代码,大神少用了一个list,二用一个index来代替array中现在的index * 因为我们确认了array的长度是len */ //自己的错误代码 public static int[] sortTransformedArray(int[] nums, int a, int b, int c) { int len = nums.length; if (nums == null || len == 0) return null; int begin = 0; int end = len - 1; List<Integer> list = new ArrayList<Integer>(); while (begin <= end) { int left = a * (int) Math.pow(nums[begin], 2.0) + b * nums[begin] + c; int right = a * (int) Math.pow(nums[end], 2.0) + b * nums[end] + c; if (left < right) { list.add(0, right); end--; } else { list.add(0, left); begin++; } } int[] res = new int[list.size()]; for (int i = 0; i < res.length; i++) { res[i] = list.get(i); } return res; } // 大神的 public int[] sortTransformedArray1(int[] nums, int a, int b, int c) { int n = nums.length; int[] sorted = new int[n]; int i = 0, j = n - 1; int index = a >= 0 ? n - 1 : 0; while (i <= j) { if (a >= 0) { sorted[index--] = quad(nums[i], a, b, c) >= quad(nums[j], a, b, c) ? quad(nums[i++], a, b, c) : quad(nums[j--], a, b, c); } else { sorted[index++] = quad(nums[i], a, b, c) >= quad(nums[j], a, b, c) ? quad(nums[j--], a, b, c) : quad(nums[i++], a, b, c); } } return sorted; } private int quad(int x, int a, int b, int c) { return a * x * x + b * x + c; }