LeetCode——桶的思想
文章目录
- 桶的思想
- 考虑使用情况
- Easy
- 剑指Offer03. [数组中重复的数字](https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/)
- 题目描述
- 思路
- 代码
- 448. [找到所有数组中消失的数字](https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/)
- Medium
- 442. [数组中重复的数据](https://leetcode-cn.com/problems/find-all-duplicates-in-an-array/)
- 题目描述
- 思路
- 代码
- Hard
- 41.[缺失的第一个正数](https://leetcode-cn.com/problems/first-missing-positive/)
- 题目描述
- 思路
- 代码
桶的思想
考虑使用情况
- 在数组内数据不是很大
a[i] ≤ a[i].len
且a[i] ≥ 0
时可以考虑使用- 数组中元素都为正或都为负
Easy
剑指Offer03. 数组中重复的数字
题目描述
思路
- 把数组想象成一排座位,数组下标表示座位号,数组中的元素值想象成小朋友的名字(根据题意,会有重名),一开始小朋友们随意坐在椅子上。
- 我们的目标是让小朋友i要坐在i号椅子上(如:元素3要坐在
num[3]
上) - 遍历数组只要
i
号椅子上坐的不是i
(if(num[i] != i)
),那么去看看i号椅子上坐的是谁- 如果i号椅子上坐的也是i(即出现同名情况),跳出循环即可
- 如果i号椅子上坐的不是i,那么将i与i号椅子上的元素交换(
exch()
)
代码
public int findRepeatNumber(int[] nums) {int result = 0;for (int i = 0; i < nums.length; i++) {while(nums[i] != i){if (nums[i] == nums[nums[i]]){result = nums[i];break;}exch(nums,i,nums[i]);}}return result;}private void exch(int[] nums, int a, int b){int temp = nums[a];nums[a] = nums[b];nums[b] = temp;}
448. 找到所有数组中消失的数字
Medium
442. 数组中重复的数据
题目描述
思路
- 对于数组中的元素,因为所有元素都大于0(
nums[1] > 1 > 0
),所以可以使用正负来表示出现的次数,正表示还没出现过,负表示出现过一次,因为nums[1] > 1 > 0
,所以Math.abs(nums[i])
为元素原值,下文使用absx
来表示元素真正的值- 对于大部分的元素(
absx != len
),nums[absx]
的正负可以表示x
出现的次数 - 当
x == nums.length
时数组会越界,此时将元素x
的出现次数在num[0]
中表示
- 对于大部分的元素(
- 由题意:元素可能出现两次或一次
- 当元素x第一次出现时将
num[i]
取负数 - 如果已经为负则表示,元素i已出现过,此次为第二次出现,将元素i加入list
- 当元素x第一次出现时将
代码
class Solution {public List<Integer> findDuplicates(int[] nums) {List<Integer> list = new ArrayList<>();int len = nums.length;for (int i = 0; i < len; i++){int absx = Math.abs(nums[i]);if (absx == len){if (nums[0] < 0){list.add(len);} else{nums[0] = - nums[0];}}else{if (nums[absx] < 0){list.add(absx);} else{nums[absx] = - nums[absx];}}}return list;}
}
Hard
41.缺失的第一个正数
题目描述
思路
- 遍历数组若数组中没有1,那么1就是没有出现的最小的正整数。
- 如果有1
- 数据整理
- 数组中
a[i] <= 0
的数不会对结果造成影响。 - 当数组中的元素从1递增至
nums.length
时,可以得到最大的结果为nums.length + 1
,如当nums[] == {1,2,3,4,5}
时,缺失的第一个正数为6。所以a[i] > nums.length + 1
的数不会对结果造成影响。 - 由于数组容量的关系,我们把num.length+1单独讨论,即也将数组中的num.length+1当做不会对结果造成影响的数据
- 将不会对结果造成影响的数据全部置为1
- 数组中
- 至此数组中元素全部为正,且
1 <= nums[i] <= num.length
。 - 此后我们用
num[1..num.length-1]
的正负来表示[1…nums.length-1]的是否出现;使用num[0]
的正负来表示num.length-1- 正(初始状态)表示没有出现过
- 负表示出现过
- 最后按照num[1…num.length-1],num[0]的顺序遍历数组,遇到的第一个大于0的数即为没有出现的最小的正整数,若全部小于0,则答案为nums.length + 1;
- 数据整理
代码
class Solution {public int firstMissingPositive(int[] nums) {//如果没有1,那么1就是没有出现的最小的正整数int count1 = 0;for (int i = 0; i < nums.length; i++){if (nums[i] == 1){count1++;}}if (count1 == 0) {return 1;}//如果有1//数组中小于等于0的元素没有意义//数组中最大的有意义的元素与数组长度有关,如:len==5 时,按数组中元素从1开始递增nums[] == {1,2,3,4,5}//把没有意义的元素全部变成1for (int i = 0; i < nums.length; i++){if (nums[i] <= 0 || nums[i] > nums.length){nums[i] = 1;}}//此时数组中元素全部为正//此时数组中元素,0 < a[i] <= num.length//使用num[i]的正负来表示i是否出现过,为正(初始状态)表示没有出现过,为负表示出现过,如num[3] == -x,表示3在数组中出现过//由于a[num.length]会导致数组越界,且数组中不包含0(所以a[0]未被使用),所以将num.length的是否出现在a[0]中表示for (int i = 0; i < nums.length; i++) {int x = Math.abs(nums[i]);if (x == nums.length){nums[0] = - Math.abs(nums[0]);} else {nums[x] = - Math.abs(nums[x]);}}//判断从[1,nums.length-1]的正负for (int i = 1; i < nums.length; i++) {if (nums[i] > 0){return i;}}//判断从nums.length-1的正负if (nums[0] > 0){return nums.length;}return nums.length+1;}
}
LeetCode——桶的思想相关推荐
- LeetCode 1282. 用户分组(桶排序思想)
1. 题目 有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组.给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返 ...
- 算法--排序--大小写字母数字分离(桶排序思想)
题目: 对D,a,F,B,c,A,z这个字符串进行排序,要求将其中所有小写字母都排在大写字母的前面,但小写字母内部和大写字母内部不要求有序.比如经过排序之后为a,c,z,D,F,B,A,这个如何来实现 ...
- 【Leetcode之算法思想】
Leetcode只算法思想 学习CS-Notes的leetcode 提示:小小记录...~ 文章目录 Leetcode只算法思想 一.双指针 最长序列 二.排序 数组中出现频率最高的k个数 按照字符出 ...
- LeetCode:递归思想的延伸,从斐波那契数列到爬楼梯模型
题目描述: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 看到这个问题的第一反应其实我想到的是排列组合的思想去解答.比如有n阶, ...
- 借助桶排序思想完成的一道题
问题: 数组排序之后的相邻数的最大差值: 嗯,你可以排序,然后找相邻的最大差值. 但是你觉得这么简单我写他干啥. 最优解:时间复杂度O(N),空间O(1) 那我们开始说这种方法: 1)遍历所有数,找到 ...
- 瑞利散射 拉曼散射 米散射_使用Cartopy的时移散射图可视化
瑞利散射 拉曼散射 米散射 简介(我们将创建的内容): (Introduction (what we'll create):) Cartopy is your choice of library if ...
- 【桶】220.存在重复元素 III 【LeetCode】
220.存在重复元素 III [LeetCode] 给你一个整数数组 nums 和两个整数 k 和 t.请你判断是否存在 两个不同下标i和j,使得 abs(nums[i] - nums[j]) < ...
- 【LeetCode笔记】621. 任务调度器(Java、桶)
文章目录 题目描述 代码 && 思路 1. 直白的 ac 做法 O(n).O(n) 2. 桶排思想的做法 O(n).O(n) 二刷 打卡第十六天- 题目描述 有点阅读题的意思,可以结合 ...
- LeetCode算法题1:判断整数数组是否存在重复元素
文章目录 前言 一.题目描述 二.思路 1.暴力破解 2.空间换时间(有点像桶排序思想) 3,排序 总结 前言 本系列文章为leetCode刷题笔记,仅供参考. 一.题目描述 给定一个整数数组,判断是 ...
最新文章
- 2020年度最佳的23个的机器学习项目(附源代码)
- mysql防止误删除的方法
- Java设计模式—模板方法模式
- android序列化异常,关于序列化:错误:Android中的序列化和反序列化
- 斯坦福大学CS229数学基础(线性代数、概率论)中文翻译版.pdf
- 【LintCode题集】Q6、Q64
- 浅谈 Scala 中下划线的用途
- 书中自有黄金屋~外加中奖结果通知
- WinForm C#全局错误捕捉处理【整理】
- java实时监控数据变化_服务数据实时监控平台
- 用python实现队列的循环左移和右移的实验原理_python的移位操作实现详解
- MySQL数据类型和常用字段属性总结
- RS485_PTZ_云台控制
- MATLA 2009B 中安装Sedumi
- qt屏幕漫天雪花飘落
- 计算机硬件技术基础 试题与答案,计算机硬件技术基础网上作业及答案
- 4g dtu无线透明通讯模块传输RS232/485手机APP全网通CAT1
- 使用Scanner收集你的身高体重,并计算出你的BMI值是多少 BMI的计算公式是 体重(kg) / (身高*身高)
- 启动Spring项目报错,Springboot启动报错 Disconnected from the target VM 解决过程
- OpenHarmony成长计划学生挑战赛7天打卡活动介绍