我正在用leetcode做destructured。
我看到了我无法理解的解决方案
它说:“对数组进行排序,中间居多”
我想问的是
“为什么排序数组中的中间元素是多数元素?”
有人可以解释这件事吗?
这个问题的要求:
给出大小为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]))
答案 0 :(得分: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的数组,但相同的想法适用于任何大小的数组。
答案 1 :(得分:0)
这是我的理解。
相反,假设中间元素不是多数元素。
因此,多数元素位于中间元素的右侧或左侧。
左侧有⌊ n/2 ⌋
个元素,右侧有n - ⌊ n/2 ⌋
个元素。
由于多数元素是出现次数超过⌊ n/2 ⌋
次的元素,因此,由于两边均为<= ⌊ n/2 ⌋
,并且多数元素都不能位于中间元素的左侧或右侧存在,因此它必须包含中间元素。
答案 2 :(得分:0)
原因是数组中是否有元素出现的次数超过n / 2次。对数组排序后。那么它们将通过中点,这就是为什么它们在索引n / 2处返回值的原因