赞
踩
题目:给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
核心思路:
双指针:右指针指向当前将要处理的元素,左指针指向下一个将要赋值的位置。
Python:
- class Solution(object): # 非官方题解
- def removeElement(self, nums, val):
- count = 0
- i = 0
- for j in range(len(nums)):
- if nums[i]==val:
- count=count+1
- if i != len(nums)-1:
- nums[i:len(nums)-1]=nums[i+1:]
- nums[-1]=val
- else:
- i=i+1
- return (len(nums)-count)
C++:
- class Solution {
- public:
- int removeElement(vector<int>& nums, int val) {
- int n = nums.size();
- int left = 0;
- for (int right = 0; right < n; right++) {
- if (nums[right] != val) {
- nums[left] = nums[right];
- left++;
- }
- }
- return left;
- }
- };
- class Solution { # optimized
- public: # 双指针分别位于首尾 重合时遍历完所有元素
- int removeElement(vector<int>& nums, int val) {
- int left = 0, right = nums.size();
- while (left < right) {
- if (nums[left] == val) {
- nums[left] = nums[right - 1];
- right--;
- } else {
- left++;
- }
- }
- return left;
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。