为什么排序数组中的中间元素是多数元素?

时间:2019-03-16 07:33:26

标签: javascript arrays

我正在用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]))

3 个答案:

答案 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处返回值的原因