🌈【LeetCode 1968. 构造元素不等于两相邻元素平均值的数组 】- JavaScript(排序+双指针)

121 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 1968. 构造元素不等于两相邻元素平均值的数组 】- JavaScript(排序+双指针)

题目描述

给你一个 下标从 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

Sort+双指针

思路分析:

核心点:先排序,首位依次插入新数组。等式成立为 nums[i-2]nums[i-1]去判定当前的nums[i]是否合法。具体实现注意点:

  • 将整个数组进行重新排序,从小到大和从大到小都可以。
  • 然后对排序后的数组进行遍历,处理方式为从第二个元素遍历到倒数第二个元素,如果遍历到一个长度为3的等差数列则交换该等差数列的第二项第三项。
  • 如果在遍历过程中发现在第二步中,由于某一次交换可能破坏前一个已经平衡了的三元等差数列,故倒退一格,重新判断。
var rearrangeArray = function (nums) {
    nums.sort((a, b) => a - b);
    let left = 0;
    let right = nums.length - 1;
    let ans = [];
    for (let i = 0; i < nums.length; i++) {
        if (i % 2 === 0) {
            ans.push(nums[left]);
            left++;
        } else {
            ans.push(nums[right]);
            right--;
        }

    }
    return ans;
};

注意:这道题目如果用递归想要实现,那么就要求数组中不可有两侧平均值等于中间数,那么可以先用循环来进行依次遍历。遍历过程中发现有平均值,则使当前数与前数进行交换。再从前两个数开始查看,因为第前两个数也会因为右侧数改变而影响平均值。若-2小于或等于0,则直接从第二个数开始从头查(第一个数没有左侧数)直到得到结果即可。


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤