返回介绍

solution / 1900-1999 / 1968.Array With Elements Not Equal to Average of Neighbors / README

发布于 2024-06-17 01:03:12 字数 3430 浏览 0 评论 0 收藏 0

1968. 构造元素不等于两相邻元素平均值的数组

English Version

题目描述

给你一个 下标从 0 开始 的数组 nums ,数组由若干 互不相同的 整数组成。你打算重新排列数组中的元素以满足:重排后,数组中的每个元素都 不等于 其两侧相邻元素的 平均值

更公式化的说法是,重新排列的数组应当满足这一属性:对于范围 1 <= i < nums.length - 1 中的每个 i(nums[i-1] + nums[i+1]) / 2 不等于 nums[i] 均成立 。

返回满足题意的任一重排结果。

 

示例 1:

输入:nums = [1,2,3,4,5]
输出:[1,2,4,5,3]
解释:
i=1, nums[i] = 2, 两相邻元素平均值为 (1+4) / 2 = 2.5
i=2, nums[i] = 4, 两相邻元素平均值为 (2+5) / 2 = 3.5
i=3, nums[i] = 5, 两相邻元素平均值为 (4+3) / 2 = 3.5

示例 2:

输入:nums = [6,2,0,9,7]
输出:[9,7,6,2,0]
解释:
i=1, nums[i] = 7, 两相邻元素平均值为 (9+6) / 2 = 7.5
i=2, nums[i] = 6, 两相邻元素平均值为 (7+2) / 2 = 4.5
i=3, nums[i] = 2, 两相邻元素平均值为 (6+0) / 2 = 3

 

提示:

  • 3 <= nums.length <= 105
  • 0 <= nums[i] <= 105

解法

方法一:排序

class Solution:
  def rearrangeArray(self, nums: List[int]) -> List[int]:
    nums.sort()
    n = len(nums)
    m = (n + 1) >> 1
    ans = []
    for i in range(m):
      ans.append(nums[i])
      if i + m < n:
        ans.append(nums[i + m])
    return ans
class Solution {
  public int[] rearrangeArray(int[] nums) {
    Arrays.sort(nums);
    int n = nums.length;
    int m = (n + 1) >> 1;
    int[] ans = new int[n];
    for (int i = 0, j = 0; i < n; i += 2, j++) {
      ans[i] = nums[j];
      if (j + m < n) {
        ans[i + 1] = nums[j + m];
      }
    }
    return ans;
  }
}
class Solution {
public:
  vector<int> rearrangeArray(vector<int>& nums) {
    sort(nums.begin(), nums.end());
    vector<int> ans;
    int n = nums.size();
    int m = (n + 1) >> 1;
    for (int i = 0; i < m; ++i) {
      ans.push_back(nums[i]);
      if (i + m < n) ans.push_back(nums[i + m]);
    }
    return ans;
  }
};
func rearrangeArray(nums []int) []int {
  sort.Ints(nums)
  n := len(nums)
  m := (n + 1) >> 1
  var ans []int
  for i := 0; i < m; i++ {
    ans = append(ans, nums[i])
    if i+m < n {
      ans = append(ans, nums[i+m])
    }
  }
  return ans
}

方法二:随机打乱

func rearrangeArray(nums []int) []int {
  rand.Seed(time.Now().UnixNano())
outer:
  for {
    rand.Shuffle(len(nums), func(i, j int) { nums[i], nums[j] = nums[j], nums[i] })
    for i := 1; i < len(nums)-1; i++ {
      if nums[i]*2 == nums[i-1]+nums[i+1] {
        continue outer
      }
    }
    return nums
  }
}

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

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

发布评论

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