当前位置: 首页 > news >正文

数据结构刷题 ——001

移动零:283. 移动零 - 力扣(LeetCode)

算法的思路:

利用双指针:

cur 往前进行寻找非0 的数

pre 负责标记该点没有处理过的下标

cur 找到了就进行交换

pre 进行交换完了,该点也处理完毕,我们就往后就行处理 0

【0,pre-1】是处理好的

【pre ,  cur 】都是0

【cur ,array.length-1】未处理的

这个方法跟我们前面学习的数据结构的快排的双指针差不多

import java.util.Arrays;public class _001 {public static void main(String[] args) {Solution solution = new Solution();int[] nums = new int[]{2, 0, 1, 0, 4, 5, 23, 0, 1, 0};System.out.println("处理前:" + Arrays.toString(nums));solution.moveZeroes(nums);System.out.println("处理后:" + Arrays.toString(nums));// 预期输出:[2, 1, 4, 5, 23, 1, 0, 0, 0, 0]}static class Solution {public void moveZeroes(int[] nums) {if(nums.length <= 1){return;}int cur = 0;int prev = 0;for (cur = 0; cur < nums.length; cur++) {if(nums[cur] != 0){swap(nums,prev,cur);prev++;}}}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}

第二种

算法的思路:

利用双指针:

cur 往前进行寻找非0 的数

pre 负责标记该点没有处理过的下标

cur 找到了就进行交换

pre 进行交换完了,该点也处理完毕,我们就往后就行处理 0

【0,pre】是处理好的

【pre+1 ,  cur -1 】都是0

【cur ,array.length-1】未处理的

package _001;import java.util.Arrays;public class _001_secord {public static void main(String[] args) {Solution solution = new Solution();int[] nums = new int[]{2, 0, 1, 0, 4, 5, 23, 0, 1, 0};System.out.println("处理前:" + Arrays.toString(nums));solution.moveZeroes(nums);System.out.println("处理后:" + Arrays.toString(nums));// 预期输出:[2, 1, 4, 5, 23, 1, 0, 0, 0, 0]}static class Solution {public void moveZeroes(int[] nums) {if(nums.length <= 1){return;}int cur = 0;int prev = -1;for (cur = 0; cur < nums.length; cur++) {if(nums[cur] != 0){prev++;swap(nums,prev,cur);}}}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}
1. 第一种划分:
  • 【0,pre-1】:已处理好的非 0 元素区间(全部为非 0,且顺序保持原始)。

  • 【pre,cur】:全为 0 的区间(这些 0 是待移到末尾的)。

  • 【cur,array.length-1】:未处理的区间(包含未检查的非 0 和 0)。

    逻辑适配:对应prev初始值为0的实现(如第一个代码)。

    • 初始时pre=0【0,pre-1】为空(还未处理元素)。
    • cur找到非 0 元素时,交换precur,此时pre位置变为非 0,加入【0,pre-1】区间,然后pre++(扩大已处理区间,同时【pre,cur】成为新的 0 区间)。
2. 第二种划分:
  • 【0,pre】:已处理好的非 0 元素区间(全部为非 0)。

  • 【pre+1,cur-1】:全为 0 的区间。

  • 【cur,array.length-1】:未处理的区间。

    逻辑适配:对应prev初始值为-1的实现(如第二个代码)。

    • 初始时pre=-1【0,pre】为空。
    • cur找到非 0 元素时,先pre++(此时pre指向待填充位置),交换后【0,pre】成为新的已处理区间,【pre+1,cur-1】自然成为 0 区间。

核心一致性

两种划分的本质完全相同:

  • 都是通过cur遍历寻找非 0 元素,通过pre标记 “下一个非 0 元素应该放置的位置”。
  • 交换后,pre始终指向 “已处理区间的最后一个非 0 元素”(或其前一位),确保pre左侧全为非 0,precur之间全为 0,未处理区间在cur右侧。

http://www.dtcms.com/a/562265.html

相关文章:

  • 网站收录查询方法阿里云搭建多个网站
  • 上海快速建站wordpress菜单栏菜单简介
  • ps做阿里网站分辨率设置龙岩网页定制
  • 傻瓜式网站建设软件网络整合营销4i原则
  • 长春火车站属于哪个区设计制作一个网站
  • 建设个读书网站大约需要投入多少钱少儿编程线下培训机构排名前十
  • 做我女朋友的套路网站网站制作视频教程
  • 上饶市住房和城乡建设网站背景图网站
  • 福田企业网站优化方案免费有限公司网站
  • 有没有网站可以学做床上用品大连城市建设管理局网站
  • 无代码网站wordpress主题模板文件下载
  • 从搭建到打磨:我的纯前端个人博客开发复盘
  • 哪里有网站制作c 网站建设报告
  • 安徽省工程建设工程信息网站黔南seo
  • 网站外包建设dw做网站学习解析
  • JavaScript基础篇:Array常用方法
  • asp网站 换模板网站如何做快捷支付接口
  • 网站建设文章官网图片站手机网站怎么做
  • HTTP 协议基本格式与 Fiddler 抓包工具实战指南
  • 金仓数据库KingbaseES通过KDTS实现SQLServer至KingbaseES迁移深度实战指南
  • 做英语quiz的网站wordpress个人资料页修改
  • (论文速读)FDConv:用于密集图像预测的频率动态卷积
  • 网站定位案例wordpress默认域名
  • 句容网站建设制作郑州市建设局官方网站
  • dbDiffo:一个免费的在线数据库设计工具
  • 拥抱现代安卓开发:从构建到发布的全新视角
  • 38_AI智能体核心业务之对话历史Agent:构建有记忆的智能对话系统
  • 体育 网站建设询价函格式池州网站seo
  • 莱阳网站制作天津网站制作费用
  • 001主引导扇区