【New Star】LeetCode 数组学习

人的梦想,永远不会结束!——黑胡子

继续我的leetcode刷题,才28道,不知道什么有200道题!

27. 移除元素

在这里插入图片描述

要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

双指针法
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。

快慢指针做法可以减少时间复杂度 ,从两个for变成一个for

class Solution {
    public int removeElement(int[] nums, int val) {
        int  low  = 0;
        for(int  high = 0;high< nums.length; high ++){
            if(val  != nums[high]){
                nums[low ++] = nums[high];
            }
        }
        return low;

    }
}

相向双指针方法
相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素
这就是首尾指针

> class Solution {
>     public int removeElement(int[] nums, int val) {
>         int  left  = 0,right = nums.length -1;
>         while(left<= right){
>             while(left <=  right && nums[left]  !=val){//这里是while而不是if
>                 left ++;
>             }
>            while(right >= left &&  nums[right] == val){
>                 right --;//--而不是++
>             }
>             if(left <=right){
>                 nums[left++] =nums[right--];
>             }
>         }
>         return  left;
> 
>     } }

26.删除排序数组中的重复项

在这里插入图片描述

想法是 不重复就替代,重复就直接进行下一次循环

class Solution {
    public int removeDuplicates(int[] nums) {
        int  low = 0;
        for(int  high = 1; high < nums.length;high++){
            if(nums[low] ==nums[high])
            continue;
            else{
                nums[++low] = nums[high];
            }

        }
        return low+1; //low是数组的下标  而要返回的是数组的长度   
    }
}

283. 移动零

在这里插入图片描述

需要保证数组的相对有序 没有保证有序 这是错误做法

class Solution {
    public void moveZeroes(int[] nums) {
        int left = 0 ,right = nums.length -1;
        while(left <= right){
            while(left <= right &&  nums[left]!= 0)
            left++;
            while(right >=left && nums[right] ==0)
            right--;
            if(left <=right){
                nums[left++] = nums[right--];
            }
        }
    }
}

正确解法:

class Solution {
    public void moveZeroes(int[] nums) {
        int low = 0;
        for(int  high = 0; high < nums.length; high++){
            if(nums[high] !=0 ){
                nums[low++] =nums[high];
            }
        }
        for(int i = low ; i < nums.length; i++)
        nums[i] = 0;
    }
}

请添加图片描述

😍 老婆不在家😍
😍一个人寂寞😍
🤩打开leetcode🤩
🤩来一次题库屠杀🤩
🙈 快乐算法🙈
💓给你从未有过的体验💓
❤️老婆不在家❤️
❤️一个人寂寞❤️
💥火熱勁慡题库💥
💥leetcode💥
💖数据结构💖
💖算法导论💖
💖畅玩整晚💖
https://leetcode.com/

坚持学习,早日进厂!!

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值