LeetCode 360. 有序转化数组(抛物线对称轴)

文章目录

1. 题目

给你一个已经 排好序 的整数数组 nums 和整数 a、b、c。对于数组中的每一个数 x,计算函数值 f(x) = ax^2 + 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-transformed-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • a = 0,函数单调,直接求值,检查首尾是否升序,降序则进行反转
  • a != 0,找到离抛物线对称轴最近的点,依距离近的优先,向两侧扩展,最后检查是否需要反转
class Solution {
public:
    vector<int> sortTransformedArray(vector<int>& nums, int a, int b, int c) {
    	int n = nums.size();
    	vector<int> ans(n);
        if(a == 0)
        {
            for(int i = 0; i < n; ++i)
            	ans[i] = f(nums[i],a,b,c);
            if(ans[0] > ans[n-1])
            	reverse(ans.begin(),ans.end());
            return ans;
        }
        double axis = -b/(2.0*a);
        int l = 0, r = 1;
        if(axis <= nums[0]) l = -1, r = 0;
        else if(axis >= nums[n-1]) l = n-1, r = n;
        else
        {
            while(nums[l]<axis)
                l++;
            l--, r = l+1;
        }
        
        double disl, disr;
        int i = 0;
        while(l>=0 || r<n)
        {
            disl = (l>=0)? fabs(nums[l]-axis) : LONG_MAX;
            disr = (r<n)? fabs(nums[r]-axis) : LONG_MAX;
            if(disl < disr)
            {
                ans[i++] = f(nums[l],a,b,c);
                l--;
            } 
            else
            {
                ans[i++] = f(nums[r],a,b,c);
                r++;
            }
        }
        if(ans[0] > ans[n-1])
            reverse(ans.begin(),ans.end());
        return ans;
    }
    int f(int x, int a, int b, int c)
    {
        return a*x*x+b*x+c;
    }
};

8 ms 9.3 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/107499297