LeetCode刷题---283. 移动零(双指针)

简介: LeetCode刷题---283. 移动零(双指针)



一、编程题:876. 链表的中间结点(双指针思路)

1.题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。 LeetCode题目链接

2.示例1:

输入: nums = [0,1,0,3,12]

输出: [1,3,12,0,0]

3.输出描述:

输入: nums = [0]

输出: [0]

4.提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

二、解题思路

1.思路

解决方法1(个人想法):

  • Step1.创建两个指针left,right,其中left赋值为-1;right赋值为0,left指针用于指向0的位置,rigtht指针指向非0的位置;
  • Step2.用for循序遍历整个数据,当当前数据为0且长度不为1的时候,就给left指针赋值;
  • Step3.在给left指针赋值时,也需要进行判定left当前位置是否大于要赋值的位置,且left不等于-1;
  • Step4.当数据不等于0且left指针不等于-1,就对数据进行交换;
  • Step5.交换完数据之后,需要对left指针进行处理,当left指针下一个指针上的值为0时,left+=1即可,反之left等于right;
    算法过程:

    根据前面的个人想法,可以对其进一步的优化
    解决方法2(优化双指针):
  • Step1.创建两个指针left,right,其中left,right赋值为0,left指针用于指向0的位置,rigtht指针指向非0的位置;
  • Step2.用for循序遍历整个数据,当当前数据为0的时候,就交换数据,并给left指针赋值;
    算法过程:其算法过程与前面相同,唯一的区别就是left一开始就指向0,而不是-1.

三、代码实现

这个代码是自己一步步试错试出来,整体代码逻辑上会有些冗余,不够简洁。每个代码块都写了注释,方便理解,代码还可以改进;

代码如下(示例):

解法一:

class Solution {
    public void moveZeroes(int[] nums) {
        int zerothis = -1;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] == 0 && (i+1) != nums.length){
                 if(zerothis > i || zerothis == -1){
                    zerothis = i;
                 }
            }else if(nums[i] != 0 && zerothis != -1){
                nums[zerothis] = nums[i];
                nums[i] = 0;
                if(nums[zerothis+1] == 0){
                    zerothis += 1;
                }else{
                    zerothis = i;
                }
            }
        }
    }
}

解法二:

class Solution {
    public void moveZeroes(int[] nums) {
      //当数组长度为1的时候,不用进行交换,直接返回
        if(nums.length == 1) return;
        int zerothis = 0;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] != 0){
                swap(nums, zerothis, i);
                zerothis++;
            }
        }
    }
  //交换函数
    public void swap(int[] nums, int left, int right) {
        // System.out.println("nums[left] = " + nums[left] + " nums[right] = " + nums[right]);
        if(left == right) return;
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

总结

以上就是今天要讲的内容,一开始做题的时候,由思路受限,只能想到先用循环来进行解决,后面看到提示双指针,于是就开始尝试用双指针来解决,但由于逻辑理得不是很清,所以写出来的代码很冗余,不过最后还是通过了。就去看下别人的双指针,发现比我的很简洁,但思路差不多,于是在根据别人的代码对自己写的双指针进行优化,所以就赶紧记录一下这个方法,开阔一下思路。

感谢观看,如果有帮助到你,请给题解点个赞和收藏,让更多的人看到。🌹 🌹 🌹

也欢迎你,关注我。👍 👍 👍

原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!


相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
113 2
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
50 3
|
3月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
26 1
|
3月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
30 1
|
3月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
25 1
|
3月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
32 0
【Leetcode刷题Python】73. 矩阵置零