文章目录

  • 桶的思想
    • 考虑使用情况
    • 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].lena[i] ≥ 0时可以考虑使用
  • 数组中元素都为正或都为负

Easy

剑指Offer03. 数组中重复的数字

题目描述

思路

  • 把数组想象成一排座位,数组下标表示座位号,数组中的元素值想象成小朋友的名字(根据题意,会有重名),一开始小朋友们随意坐在椅子上。
  • 我们的目标是让小朋友i要坐在i号椅子上(如:元素3要坐在num[3]上)
  • 遍历数组只要i号椅子上坐的不是iif(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

代码

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——桶的思想相关推荐

  1. LeetCode 1282. 用户分组(桶排序思想)

    1. 题目 有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组.给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返 ...

  2. 算法--排序--大小写字母数字分离(桶排序思想)

    题目: 对D,a,F,B,c,A,z这个字符串进行排序,要求将其中所有小写字母都排在大写字母的前面,但小写字母内部和大写字母内部不要求有序.比如经过排序之后为a,c,z,D,F,B,A,这个如何来实现 ...

  3. 【Leetcode之算法思想】

    Leetcode只算法思想 学习CS-Notes的leetcode 提示:小小记录...~ 文章目录 Leetcode只算法思想 一.双指针 最长序列 二.排序 数组中出现频率最高的k个数 按照字符出 ...

  4. LeetCode:递归思想的延伸,从斐波那契数列到爬楼梯模型

    题目描述: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 看到这个问题的第一反应其实我想到的是排列组合的思想去解答.比如有n阶, ...

  5. 借助桶排序思想完成的一道题

    问题: 数组排序之后的相邻数的最大差值: 嗯,你可以排序,然后找相邻的最大差值. 但是你觉得这么简单我写他干啥. 最优解:时间复杂度O(N),空间O(1) 那我们开始说这种方法: 1)遍历所有数,找到 ...

  6. 瑞利散射 拉曼散射 米散射_使用Cartopy的时移散射图可视化

    瑞利散射 拉曼散射 米散射 简介(我们将创建的内容): (Introduction (what we'll create):) Cartopy is your choice of library if ...

  7. 【桶】220.存在重复元素 III 【LeetCode】

    220.存在重复元素 III [LeetCode] 给你一个整数数组 nums 和两个整数 k 和 t.请你判断是否存在 两个不同下标i和j,使得 abs(nums[i] - nums[j]) < ...

  8. 【LeetCode笔记】621. 任务调度器(Java、桶)

    文章目录 题目描述 代码 && 思路 1. 直白的 ac 做法 O(n).O(n) 2. 桶排思想的做法 O(n).O(n) 二刷 打卡第十六天- 题目描述 有点阅读题的意思,可以结合 ...

  9. LeetCode算法题1:判断整数数组是否存在重复元素

    文章目录 前言 一.题目描述 二.思路 1.暴力破解 2.空间换时间(有点像桶排序思想) 3,排序 总结 前言 本系列文章为leetCode刷题笔记,仅供参考. 一.题目描述 给定一个整数数组,判断是 ...

最新文章

  1. 2020年度最佳的23个的机器学习项目(附源代码)
  2. mysql防止误删除的方法
  3. Java设计模式—模板方法模式
  4. android序列化异常,关于序列化:错误:Android中的序列化和反序列化
  5. 斯坦福大学CS229数学基础(线性代数、概率论)中文翻译版.pdf
  6. 【LintCode题集】Q6、Q64
  7. 浅谈 Scala 中下划线的用途
  8. 书中自有黄金屋~外加中奖结果通知
  9. WinForm C#全局错误捕捉处理【整理】
  10. java实时监控数据变化_服务数据实时监控平台
  11. 用python实现队列的循环左移和右移的实验原理_python的移位操作实现详解
  12. MySQL数据类型和常用字段属性总结
  13. RS485_PTZ_云台控制
  14. MATLA 2009B 中安装Sedumi
  15. qt屏幕漫天雪花飘落
  16. 计算机硬件技术基础 试题与答案,计算机硬件技术基础网上作业及答案
  17. 4g dtu无线透明通讯模块传输RS232/485手机APP全网通CAT1
  18. 使用Scanner收集你的身高体重,并计算出你的BMI值是多少 BMI的计算公式是 体重(kg) / (身高*身高)
  19. 启动Spring项目报错,Springboot启动报错 Disconnected from the target VM 解决过程
  20. OpenHarmony成长计划学生挑战赛7天打卡活动介绍

热门文章

  1. 重要通知(温馨提示:大家访问博客的时候先清理一下浏览器缓存)
  2. CNN网络结构理解:感受野计算方法
  3. MATLAB 画五星红旗
  4. BZOJ 1193--马步距离
  5. nod-1631-小鲨鱼在51nod小学
  6. App渠道打包的最佳攻略,一次解决打包难题
  7. 论文阅读(6)用集合深度学习方法在皮肤镜图像中进行皮肤病变分割
  8. Struts2的 两个蝴蝶飞 你好 (一)
  9. vue+百度地图实现搜索功能
  10. 【Python实战】再分享一款商品秒杀小工具,我已经把压箱底的宝贝拿出来啦~