前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 360. 有序转化数组(抛物线对称轴)

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

作者头像
Michael阿明
发布2021-02-19 10:08:33
5150
发布2021-02-19 10:08:33
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

给你一个已经 排好序 的整数数组 nums 和整数 a、b、c。对于数组中的每一个数 x,计算函数值 f(x) = ax^2 + bx + c,请将函数值产生的数组返回。

要注意,返回的这个数组必须按照 升序排列,并且我们所期望的解法时间复杂度为 O(n)

代码语言:javascript
复制
示例 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,找到离抛物线对称轴最近的点,依距离近的优先,向两侧扩展,最后检查是否需要反转
代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档