只做网站应该找谁,网易企业邮箱手机怎么登录,做宣传图片的软件,房产官方网站给你一个已经 排好序 的整数数组 nums 和整数 a、b、c。对于数组中的每一个数 x#xff0c;计算函数值 f(x) ax2 bx c#xff0c;请将函数值产生的数组返回。
要注意#xff0c;返回的这个数组必须按照 升序排列#xff0c;并且我们所期望的解法时间复杂度为 O(n)。
示…给你一个已经 排好序 的整数数组 nums 和整数 a、b、c。对于数组中的每一个数 x计算函数值 f(x) ax2 bx c请将函数值产生的数组返回。
要注意返回的这个数组必须按照 升序排列并且我们所期望的解法时间复杂度为 O(n)。
示例 1
输入: nums [-4,-2,2,4], a 1, b 3, c 5 输出: [3,9,15,33] 示例 2
输入: nums [-4,-2,2,4], a -1, b 3, c 5 输出: [-23,-5,1,7]
思路
先判断是否为二次函数。
如果是再判断开口的上下根据和对称轴点的距离来判断函数值的大小走双指针的逻辑。
class Solution {public int[] sortTransformedArray(int[] nums, int a, int b, int c) {int lennums.length;int[] ansnew int[len];if(a0){if(b0){for(int i0;ilen;i){ans[i]b*nums[i]c;}}else{for(int i0;ilen;i){ans[i]b*nums[len-i-1]c;}}}else if(a0){double mid -b * 1.0 / a / 2;int start0;int endlen-1;int indexlen-1;while(startend){if(Math.abs(mid-nums[start])Math.abs(mid-nums[end])){ans[index--]a*nums[start]*nums[start]b*nums[start]c;start;}else{ans[index--]a*nums[end]*nums[end]b*nums[end]c;end--;}}}else{double mid -b * 1.0 / a / 2;int start0;int endlen-1;int index0;while(startend){if(Math.abs(mid-nums[start])Math.abs(mid-nums[end])){ans[index]a*nums[start]*nums[start]b*nums[start]c;start;}else{ans[index]a*nums[end]*nums[end]b*nums[end]c;end--;}}}return ans;}
}