javascript - 为什么排序数组中的中间元素是多数元素?
问题描述
我在 leetcode中做这个问题。
我看到了一个我无法理解的解决方案
它说“对数组进行排序,中间占多数”
我想问的是
“为什么排序数组中的中间元素是多数元素?”
有人可以解释这件事吗?
这个问题的要求:
给定一个大小为 n 的数组,找到多数元素。多数元素是出现超过 ⌊ n/2 ⌋ 次的元素。
您可以假设数组是非空的,并且多数元素始终存在于数组中。
这是答案的代码:
var majorityElement = function(nums) {
// sort the array and the middle is the majority
nums.sort((a,b) => a - b);
return nums[Math.floor(nums.length/2)];
};
console.log(majorityElement([3,2,3]))
console.log(majorityElement([2,2,1,1,1,2,2]))
解决方案
假设输入的数组有一个多数元素,它会在数组中至少出现(n / 2) + 1
几次。如果多数元素是数组中的最小数字,则排序后的数组将如下所示:
MMMMXX
^^ mid (even)
或者
MMMMMXXX
^ mid (odd)
其中M
是多数元素,X 代表任何其他元素。如您所见,M
将始终落在数组的中间。如果多数元素是数组中的最大数字,那么它看起来像:
XXMMMM
^^ mid (even)
或者
XXXMMMM
^ mid (odd)
M
还在中间。
如果M
既不是数组中的最高元素也不是最低元素,则排序后的数组仍将M
位于中间,无论您如何尝试移动范围:
XXMMMM
XMMMMX
MMMMXX
^^
或者
XXXMMMM
XXMMMMX
XMMMMXX
MMMMXXX
^
这些示例仅适用于长度为 6 和 7 的数组,但同样的想法适用于任何大小的数组。
推荐阅读
- sql - 选择 current_user 的组名
- hadoop - 如何停止 Hadoop cat:在 shell 中运行循环时无法自动写入输出流?
- macos - 从命令行杀死 vscode
- c# - 发布到 ARM 上的 Linux 后找不到静态文件
- akka - Akka http 流式传输响应标头
- c# - 如何使用表单身份验证获取 Windows 用户凭据?
- delphi - Delphi 10.2 编辑器中是否有热键可以反转所选文本的大小写?
- powershell - 如何将文件从 azure 存储帐户下载到 power shell 中的临时文件变量
- swift - iOS - 如何从 AppDelegate 中删除 UINavigationController?
- scala - Scala中的动态滑动窗口