多数元素

题目描述:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

  • 🌰1:

    1. 输入:[3,2,3]
    2. 输出:3
  • 🌰2:

    1. 输入:[2,2,1,1,1,2,2]
    2. 输出:2

    解法:

    1. 计数法
  • 循环数组前后元素做比较,如元素相同count加一,若元素不同count减一,当cout为负数的时候证明当前元素并不是多数元素。 ```javascript const majorityElement = (arr) => { let curVal = arr[0]; let count = 0; for (let i = 0; i < arr.length; i++) { count = arr[i] === curVal ? ++count : —count; if (count < 0) {

    1. curVal = arr[i];
    2. count = -count;

    } } return curVal; };

const result = majorityElement([6, 5, 5]);


---

<a name="jFb8x"></a>
### 删除有序重复数组
<a name="JNEaN"></a>
#### 题目描述:给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

- 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。
- 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
<a name="yXvUn"></a>
#### 🌰:

输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

```
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

解法:

1. 快慢双指针
  • 使用慢指针 j 记录不重复数组的下标,i 指针寻找新的不重复的元素。
    function removeDuplicates(nums) {
    let j = 0;
    for (let i = 1; i < nums.length; i++) {
      if(nums[j]!==nums[i]){
        nums[++j] = nums[i]
      }
    }
    return j+1;
    }
    

删除有序数组中的重复项 II

题目描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

  • 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

🌰:

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。
输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。

解法🛠:

1. 快慢指针
  • 快慢指针对比前后两个元素是否重复,并且使用变量isAgain判断是第几次重复,若重复了两次以上用splice函数删除。 ```javascript const removeDuplicates = function (nums) { if (nums.length < 3) return nums.length; let i = 0; let j = i + 1; let isAgain = false; while (i < j && j < nums.length) { if (nums[i] !== nums[j] && !isAgain) {
    i++;
    j++;
    
    } else if (nums[i] === nums[j] && !isAgain) {
    isAgain = true;
    j++;
    i++;
    
    } else if (nums[i] === nums[j] && isAgain) {
    nums.splice(j, 1);
    
    } else if (nums[i] !== nums[j] && isAgain) {
    isAgain = false;
    i++;
    j++;
    
    } } return nums.length; };

const result = removeDuplicates([0, 0, 1, 1, 1, 1, 2, 3, 3]); console.log(result);

<a name="jZrOS"></a>
##### 2. 快慢指针优化版本
```javascript
const removeDuplicates = function (nums) {
  if (nums.length < 3) return nums.length;
  let i = 2;
  let j = 2;
  while (j < nums.length) {
    if (nums[i - 2] !== nums[j]) {
      nums[i] = nums[j];
      i++;
    }
    j++;
  }
  return i;
};

const result = removeDuplicates([0, 0, 1, 1, 1, 1, 2, 3, 3]);
console.log(result);