力扣27.移除元素(Java)

思路:

使用双指针,其中一个指针用来寻找不同val的下标,另一个指针用来赋值

复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
        int left=0;//用来赋值的指针
        for(int right=0;right<nums.length;right++){//用来寻找不同与val的下标的指针
            if(nums[right]!=val){//如果找到不同与val
                nums[left]=nums[right];//赋值
                left++;//赋值的下标++
            }
        }
        return left;//同时也是不同val的总数
    }
}

虽然很简单,但是还能再优化,按照上面的代码,会重复赋值需要保留的数据,例如最坏的情况,没有等于val的数,数组:[1,2,3,4,5,6,7],val=8,那么就会将该数组重复赋值,但是一个没有必要移除,这时就该换个思路,即从如果有不同与val的就赋值,改为如果有与val相同的就赋值,这样子就保证了只要我们进行了操作,就一定是在移除相同元素

因为我们知道移除后的数组的长度一定小于等于原数组,所以我们可以用前后两个指针,当出现相同val时直接从最后的一个元素往前赋值,因为我们不知道这个元素是否相同与val,所以我们暂时不动前面这个指针,继续判断,同时让这个后面的指针往前移动一位,直到前指针和后指针相遇则说明完成了移除

php 复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
        int left = 0;//前指针
        int right = nums.length;//后指针
        while (left < right) {//当它们没有相遇时
            if (nums[left] == val) {//如果出现相同val的
                nums[left] = nums[right - 1];//后指针赋值给前指针
                right--;//后指针往前移动一位,但是前指针不动,因为无法判断这个后指针赋的值是否等于val
            } else {//如果不相同
                left++;//前指针往后移动
            }
        }
        return left;
    }
}

这样子就保证了只要我们进行操作,就一定是在做有用功,对之前可能做有用功,也有可能做无用功进行了优化

相关推荐
圣保罗的大教堂6 分钟前
leetcode 61. 旋转链表 中等
leetcode
500841 小时前
昇腾 CANN 的五层架构,到底分了哪五层
java·人工智能·分布式·架构·ocr·wpf
摇滚侠1 小时前
Java 零基础全套教程,File 类与 IO 流,笔记 177-178
java·开发语言·笔记
全糖可乐气泡水2 小时前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度
雨落在了我的手上2 小时前
初始java(十):类和对象(⼆)
java·开发语言
h_a_o777oah2 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
05候补工程师2 小时前
从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南
人工智能·算法·安全·架构·机器人
莫雪歌2 小时前
Java AI 应用开发实践:基于 Spring Boot 实现 Chat、Memory、RAG 与 Tool Calling
java·aigc
SmartBrain3 小时前
AI全栈开发(SDD):慢病管理系统工程级设计
java·大数据·开发语言·人工智能·架构·aigc
梦想CAD控件3 小时前
网页端对DWG图纸进行预览与批注(CAD轻量化)
java·前端·javascript