(LeetCode 面试经典 150 题) 27.移除元素

目录

题目:

题目描述:

题目链接:

思路:

核心思路:

思路详解:

样例模拟:

代码:

C++代码:

Java代码:


题目:

题目描述:

题目链接:

27. 移除元素 - 力扣(LeetCode)

思路:

核心思路:

双指针

思路详解:

我们先按最容易理解的思路:定义两个指针i,j,i指针指向第一个元素,j指针指向最后一个元素。我们要遍历数组中所有的元素进行换位调整,所以编译完全部元素的条件是两个指针交错(即i>j)。在while语句中,判断i指向的元素是否等于val,如果不等于那么不用调整直接跳过,即i指针后移。如果i指向的元素等于val,那么我们将i指向的元素和j指向的元素对调。此时换到i上的元素是否等于val我们不知道,所以要到下一轮再判断,但是此时换到j上的元素一定等于val,所以j指针前移。

到最后的i索引一定是最后一个不等于val元素的后一位,所以最后一个不等于val元素的索引为i-1,即一共有i个不等于val的元素。由题要返回不等于val元素的个数,所以返回i。

上述是最容易理解且详细的思路,由题我们其实只需要保证最后nums的前k个元素是不等于val的元素,nums其余元素和nums大小不重要。所以我们不需要i与j指向元素互换,只需要把j指向元素换到i就行了

样例模拟:

代码:

C++代码:

复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int i = 0;                //i指针指向第一个元素
        int j = nums.size() - 1;  //j指针指向最后一个元素
        //int temp;
        while(i <= j)  //当两个指针交错时表示全部元素已经遍历完了
        {
            if(nums[i] != val)
            {
                i++;  //如果i指向的元素不等于val直接跳过,i指针后移
            }
            else
            {
                //temp = nums[i];
                nums[i] = nums[j];  //如果i指向的元素等于val,与j指向的元素进行交换
                //nums[j] = temp;
                j--;  //那么此时j指向的一定是换过来等于val的值,j指针前移
            }
        }
        return i;  //由题返回不等于val的元素数量
    }
};

Java代码:

复制代码
class Solution {
    public int removeElement(int[] nums, int val) {
        int i = 0;
        int j = nums.length -1;
        //int temp;
        while(i <= j)
        {
            if(nums[i] != val)
            {
                i++;
            }
            else
            {
                //temp = nums[i];
                nums[i] = nums[j];
                //nums[j] = temp;
                j--;
            }
        }
        return i;
    }
}
相关推荐
liuyao_xianhui6 小时前
优选算法_分治_快速排序_归并排序_C++
开发语言·数据结构·c++·算法·leetcode·排序算法·动态规划
重庆小透明6 小时前
【搞定面试之mysql】第一篇:mysql的优化和索引
mysql·面试·职场和发展
Shinran永恒6 小时前
Android资源类型列举及四种常用的布局资源详细介绍
面试
重铸码农荣光6 小时前
手写一个精简版 Zustand:深入理解 React 状态管理的核心原理
react.js·面试·源码
爱丽_7 小时前
ThreadLocal 机制:弱引用 Entry、内存泄漏、线程池复用与线上排查
java·jvm·算法
本末倒置1837 小时前
告别"话痨"提交记录!Git 压缩 Commit 实战指南,代码洁癖党狂喜
面试·程序员·代码规范
2301_815482937 小时前
C++编译期矩阵运算
开发语言·c++·算法
☆5667 小时前
C++中的类型擦除技术
开发语言·c++·算法
m0_569881477 小时前
C++与自动驾驶系统
开发语言·c++·算法
我叫黑大帅7 小时前
🚀 JS 最常用的性能优化 防抖和节流
前端·javascript·面试