多数元素
题目描述:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
🌰1:
输入:[3,2,3]输出:3
🌰2:
输入:[2,2,1,1,1,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) {
curVal = arr[i];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) {
} else 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);
} } return nums.length; };isAgain = false; i++; j++;
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);
