持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【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,则直接从第二个数开始从头查(第一个数没有左侧数)直到得到结果即可。
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤