返回介绍

solution / 0300-0399 / 0360.Sort Transformed Array / README

发布于 2024-06-17 01:04:01 字数 4161 浏览 0 评论 0 收藏 0

360. 有序转化数组

English Version

题目描述

给你一个已经 排好序 的整数数组 nums 和整数 a 、 b 、 c 。对于数组中的每一个元素 nums[i] ,计算函数值 f(_x_) = _ax_2 + _bx_ + c ,请 _按升序返回数组_ 。

 

示例 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]

 

提示:

  • 1 <= nums.length <= 200
  • -100 <= nums[i], a, b, c <= 100
  • nums 按照 升序排列

 

进阶:你可以在时间复杂度为 O(n) 的情况下解决这个问题吗?

解法

方法一

class Solution:
  def sortTransformedArray(
    self, nums: List[int], a: int, b: int, c: int
  ) -> List[int]:
    def f(x):
      return a * x * x + b * x + c

    n = len(nums)
    i, j, k = 0, n - 1, 0 if a < 0 else n - 1
    res = [0] * n
    while i <= j:
      v1, v2 = f(nums[i]), f(nums[j])
      if a < 0:
        if v1 <= v2:
          res[k] = v1
          i += 1
        else:
          res[k] = v2
          j -= 1
        k += 1
      else:
        if v1 >= v2:
          res[k] = v1
          i += 1
        else:
          res[k] = v2
          j -= 1
        k -= 1
    return res
class Solution {
  public int[] sortTransformedArray(int[] nums, int a, int b, int c) {
    int n = nums.length;
    int i = 0, j = n - 1, k = a < 0 ? 0 : n - 1;
    int[] res = new int[n];
    while (i <= j) {
      int v1 = f(a, b, c, nums[i]), v2 = f(a, b, c, nums[j]);
      if (a < 0) {
        if (v1 <= v2) {
          res[k] = v1;
          ++i;
        } else {
          res[k] = v2;
          --j;
        }
        ++k;
      } else {
        if (v1 >= v2) {
          res[k] = v1;
          ++i;
        } else {
          res[k] = v2;
          --j;
        }
        --k;
      }
    }
    return res;
  }

  private int f(int a, int b, int c, int x) {
    return a * x * x + b * x + c;
  }
}
class Solution {
public:
  vector<int> sortTransformedArray(vector<int>& nums, int a, int b, int c) {
    int n = nums.size();
    int i = 0, j = n - 1, k = a < 0 ? 0 : n - 1;
    vector<int> res(n);
    while (i <= j) {
      int v1 = f(a, b, c, nums[i]), v2 = f(a, b, c, nums[j]);
      if (a < 0) {
        if (v1 <= v2) {
          res[k] = v1;
          ++i;
        } else {
          res[k] = v2;
          --j;
        }
        ++k;
      } else {
        if (v1 >= v2) {
          res[k] = v1;
          ++i;
        } else {
          res[k] = v2;
          --j;
        }
        --k;
      }
    }
    return res;
  }

  int f(int a, int b, int c, int x) {
    return a * x * x + b * x + c;
  }
};
func sortTransformedArray(nums []int, a int, b int, c int) []int {
  n := len(nums)
  i, j, k := 0, n-1, 0
  if a >= 0 {
    k = n - 1
  }
  res := make([]int, n)
  for i <= j {
    v1, v2 := f(a, b, c, nums[i]), f(a, b, c, nums[j])
    if a < 0 {
      if v1 <= v2 {
        res[k] = v1
        i++
      } else {
        res[k] = v2
        j--
      }
      k++
    } else {
      if v1 >= v2 {
        res[k] = v1
        i++
      } else {
        res[k] = v2
        j--
      }
      k--
    }
  }
  return res
}

func f(a, b, c, x int) int {
  return a*x*x + b*x + c
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文