Given a sorted array of integers nums and integer values a, band c. Apply a quadratic function of the form f(x) = ax2 + bx + c to each element x in the array.html
The returned array must be in sorted order.java
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:post
Input: nums = [-4,-2,2,4], a = -1, b = 3, c = 5 Output: [-23,-5,1,7]
Credits:
Special thanks to @elmirap for adding this problem and creating all test cases.this
这道题给了咱们一个数组,又给了咱们一个抛物线的三个系数,让咱们求带入抛物线方程后求出的数组成的有序数组。那么咱们首先来看O(nlgn)的解法,这个解法没啥可说的,就是每一个算出来再排序,这里咱们用了最小堆来帮助咱们排序,参见代码以下:url
解法一:spa
class Solution { public: vector<int> sortTransformedArray(vector<int>& nums, int a, int b, int c) { vector<int> res; priority_queue<int, vector<int>, greater<int>> q; for (auto d : nums) { q.push(a * d * d + b * d + c); } while (!q.empty()) { res.push_back(q.top()); q.pop(); } return res; } };
可是题目中的要求让咱们在O(n)中实现,那么咱们只能另辟蹊径。其实这道题用到了大量的高中所学的关于抛物线的数学知识,咱们知道,对于一个方程f(x) = ax2 + bx + c 来讲,若是a>0,则抛物线开口朝上,那么两端的值比中间的大,而若是a<0,则抛物线开口朝下,则两端的值比中间的小。而当a=0时,则为直线方法,是单调递增或递减的。那么咱们能够利用这个性质来解题,题目中说明了给定数组nums是有序的,若是不是有序的,我想很难有O(n)的解法。正由于输入数组是有序的,咱们能够根据a来分状况讨论:指针
当a>0,说明两端的值比中间的值大,那么此时咱们从结果res后往前填数,用两个指针分别指向nums数组的开头和结尾,指向的两个数就是抛物线两端的数,将它们之中较大的数先存入res的末尾,而后指针向中间移,重复比较过程,直到把res都填满。code
当a<0,说明两端的值比中间的小,那么咱们从res的前面日后填,用两个指针分别指向nums数组的开头和结尾,指向的两个数就是抛物线两端的数,将它们之中较小的数先存入res的开头,而后指针向中间移,重复比较过程,直到把res都填满。
当a=0,函数是单调递增或递减的,那么从前日后填和从后往前填均可以,咱们能够将这种状况和a>0合并。
解法二:
class Solution { public: vector<int> sortTransformedArray(vector<int>& nums, int a, int b, int c) { int n = nums.size(), i = 0, j = n - 1; vector<int> res(n); int idx = a >= 0 ? n - 1 : 0; while (i <= j) { if (a >= 0) { res[idx--] = cal(nums[i], a, b, c) >= cal(nums[j], a, b, c) ? cal(nums[i++], a, b, c) : cal(nums[j--], a, b, c); } else { res[idx++] = cal(nums[i], a, b, c) >= cal(nums[j], a, b, c) ? cal(nums[j--], a, b, c) : cal(nums[i++], a, b, c); } } return res; } int cal(int x, int a, int b, int c) { return a * x * x + b * x + c; } };
相似题目:
Squares of a Sorted Array
参考资料:
https://leetcode.com/problems/sort-transformed-array/
https://leetcode.com/discuss/108831/java-o-n-incredibly-short-yet-easy-to-understand-ac-solution