27. 移除元素_解题思路与注意事项_代码分析

27. 移除元素

移除元素

移除元素并不是真正的移除,而是将未被元素调换到数组的前部

较快的解决办法:就是遍历整个数组

如果数组中的元素满足**!=val的条件,那么就把这个元素“挪动”到数组的前部,遍历结束的时候,整个数组也就完成了元素的前部置换,也就满足了题目的要求,index的大小自然随着挪动次数的自增就是移除val值元素之后的数组元素个数**

该解法的不足之处

挪动元素的操作执行了nums.length次,在起始元素不为val时,显然其中很多次挪动操作可能是无意义的,执行的很可能是nums[i]=nums[i]此类的无意义操作
且只要数组元素中存在
==val
的元素,就会引起后续元素的全部替换,

 public int removeElement(int[] nums, int val) {
        int index = 0;
        for(int num : nums){
            if(num != val){
                nums[index++] = num;
            }
        }
        return index;
    }

双指针

注意int right = nums.length-1;while (left <= right)的对应关系

解法思路

left指针从左到右移动,right指针从右向左移动,二者碰撞之时算法结束
算法不判断right值是否**==val**,而是直接与nums[left]进行替换操作,在一次while循环中 left指针和right指针中的一个进行移动

如发现替换后的nums[left]值仍然是值==val的需被移除元素,则继续用*nums[right]nums[left]**替换。

left指针right指针碰撞之时,算法结束

**if (nums[left] == val)使得算法减少了很多无意义的替换操作,left的值随着left++**移动也就是移除元素后数组的长度

class Solution {
    public int removeElement(int[] nums, int val) {
        int left = 0;
        int right = nums.length-1;
        while (left <= right) {
            if (nums[left] == val) {
                nums[left] = nums[right];
                right--;
            } else {
                left++;
            }
        }
        return left;
    }
}





#算法刷题与整理/数组
#算法刷题与整理/双指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值