news 2026/5/21 22:21:11

【LeetCode 手撕算法】(技巧)只出现一次的数字、多数元素(摩尔投票法)、颜色分类(三指针荷兰国旗算法)、下一个排列、寻找重复数(快慢指针 Floyd判圈算法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode 手撕算法】(技巧)只出现一次的数字、多数元素(摩尔投票法)、颜色分类(三指针荷兰国旗算法)、下一个排列、寻找重复数(快慢指针 Floyd判圈算法)

136-只出现一次的数字

思路:异或,初始为3则变成二进制为011, 两个相同的数字异或为0;按照题目要求,22相同,只有一个不同,还要取这一个,则就用异或

4^2^3^2^3=4

class Solution { public int singleNumber(int[] nums) { int result=0; for(int num:nums){ result^=num; } return result; } }

169-多数元素(摩尔投票法

思路:选数量过半的元素,采用temp来临时接元素,初始判断是否为0并赋值;每遍历一个就对比,相同就++,不同就抵消--

注意:返回值是返回元素,不是返回数量

class Solution { public int majorityElement(int[] nums) { int temp=0; int count=0; for(int num:nums){ if(count==0){ temp=num; } if(temp==num){count++;} else{count--;} } return temp; } }

75-颜色分类(三指针、荷兰国旗算法)

思路:三指针(荷兰国旗算法)

  1. 如果nums[i] == 0:交换nums[i]nums[left]left++i++

  2. 如果nums[i] == 2:交换nums[i]nums[right]right--(注意:i 不移动,因为换过来的数还没检查)

  3. 如果nums[i] == 1i++

循环条件:i <= right(right 之后都是 2,不需要检查)

注意:==2时,i不需要++ ,因为开始就在左边,换左时才加,换右时不占位置

class Solution { public void sortColors(int[] nums) { int i=0; int left=0; int right=nums.length-1; while(i<=right){ if(nums[i]==0){ swap(nums,i,left); left++; i++; }else if(nums[i]==2){ swap(nums,i,right); right--; }else{ i++; } } } public void swap(int[] nums,int i,int j){ int temp; temp=nums[i]; nums[i]=nums[j]; nums[j]=temp; } }

31-下一个排列

思路:从右向左找到第一个升序对(i, i+1),即nums[i] < nums[i+1]
然后在[i+1, 结束]中找到比 nums[i] 大的最小的数,交换它们,最后将[i+1, 结束]反转成升序。

步骤:

  1. 从右向左找到第一个i,满足nums[i] < nums[i+1]

    • 如果找不到(整个数组降序),直接反转整个数组

  2. 从右向左找到第一个j,满足nums[j] > nums[i]j > i

  3. 交换nums[i]nums[j]

  4. 反转[i+1, n-1]部分(使其升序)

注意:选升序后面比 nums[i] 大的最小的数,不需要min之类的,因为能找到升序 说明后面都是降序排列,则从最右找 第一个就是;

注意翻转的传参tempi+1就行;

不能在局部取相关i和j, 必须用专门的暂存值来取;

class Solution { public void nextPermutation(int[] nums) { int n=nums.length; int tempi=-1; int tempj=-1; for(int i=n-2;i>=0;i--){ //找右边第一个升序 if(nums[i]<nums[i+1]){ tempi=i; break; } } if(tempi>=0){//若升序存在 for(int j=n-1;j>tempi;j--){ //若升序存在,找大于i的里面最小数 if(nums[j]>nums[tempi]){//升序部分之后 一定是降序,因此从最右边选就行 tempj=j; break; } } swap(nums,tempi,tempj); } reverse(nums,tempi+1,n-1);//否则翻转tempi之后整个数组 } public void swap(int[] nums,int i, int j){ int temp=0; temp=nums[i]; nums[i]=nums[j]; nums[j]=temp; } public void reverse(int[] nums,int i,int j){ while(i<j){ swap(nums,i,j); i++; j--; } } }

287-寻找重复数 快慢指针(Floyd 判圈算法)

思路:不用理解直接背

  • nums[i]看作i → nums[i]的指针

  • 因为元素范围[1, n],不会指向0(不会出界)

  • 重复的数意味着有多个索引指向同一个值 → 形成环

    步骤:

  • 快慢指针

    • slow = nums[0]

    • fast = nums[nums[0]](快指针一次走两步)

  • 第一次相遇(检测环):

    • slow走一步:slow = nums[slow]

    • fast走两步:fast = nums[nums[fast]]

    • 相遇时停止

  • 找环的入口(重复的数):

    • slow回到起点:slow = 0

    • 两个指针都每次走一步

    • 再次相遇的地方就是重复的数

class Solution { public int findDuplicate(int[] nums) { int slow=nums[0]; int fast=nums[nums[0]]; //fast二倍速 while(slow!=fast){ //slow和fast相遇则停止 slow=nums[slow]; fast=nums[nums[fast]]; } slow=0; //slow回到起点,fast还是相遇点 while(slow!=fast){//再次相遇就是入口 slow=nums[slow]; fast=nums[fast]; } return slow;//slow和fast都可以 } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 22:17:02

国内大学生必备的AI论文写作工具有哪些?

国内高校学生常用的 AI 论文写作工具&#xff0c;以本土化全流程工具为主&#xff0c;结合通用大模型与专业辅助功能&#xff0c;覆盖选题、框架搭建、初稿撰写、查重降重、格式调整等关键环节&#xff0c;以下是主流工具详解与对比&#xff1a;一、本土全流程论文 AI 工具&…

作者头像 李华
网站建设 2026/5/21 22:13:17

大牛直播SDK(SmartMediaKit)Android Unity3D 播放器集成文档

目标平台&#xff1a;Android&#xff08;API 21&#xff09; 支持协议&#xff1a;RTSP、RTMP 目录 概述环境要求工程文件说明快速集成步骤PlayerConfig 配置说明核心 API 说明事件回调说明录像功能视频渲染原理 1. 概述 本文档描述如何在 Android Unity3D 工程中集成大牛直…

作者头像 李华
网站建设 2026/5/21 22:07:12

巨亏47亿,市值5000亿:拆解智谱AI的定价逻辑

2026年1月8日&#xff0c;智谱以每股116.2港元登陆港交所。截至5月中旬&#xff0c;其股价一度冲上1160港元&#xff0c;市值突破5000亿港元&#xff0c;较发行价累涨近10倍。而同期披露的2025年财报显示&#xff0c;公司全年营收7.24亿元&#xff0c;经调整净亏损31.82亿元。来…

作者头像 李华
网站建设 2026/5/21 22:06:38

亲测新加坡家具物流优质公司分享

在新加坡家具物流领域&#xff0c;捷晟物流是较为优质的选择。以下为你详细介绍相关内容。服务模式多样捷晟物流提供海运和空运两种服务模式。海运方面&#xff0c;有整柜&#xff08;FCL&#xff09;与拼货&#xff08;LCL&#xff09;两种选择。对于批量较大的家具运输&#…

作者头像 李华