LeetCode——桶的思想

C/C++解OJ题--有效的字母异位词(用桶思想解决) 桶真的是个好东西,不仅可以装水,还可也排序,还可以解题…… 阅读详情

桶的思想

考虑使用情况

  • 在数组内数据不是很大
  • a[i] ≤ a[i].len且a[i] ≥ 0时可以考虑使用
  • 数组中元素都为正或都为负

Easy

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

题目描述

image.png

思路
  • 把数组想象成一排座位,数组下标表示座位号,数组中的元素值想象成小朋友的名字(根据题意,会有重名),一开始小朋友们随意坐在椅子上。
  • 我们的目标是让小朋友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. 数组中重复的数据

题目描述

image.png

思路
  • 对于数组中的元素,因为所有元素都大于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.缺失的第一个正数

题目描述

image.png

思路
  • 遍历数组若数组中没有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}
            //把没有意义的元素全部变成1
        for (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;
    }
}
通达信双紫擒龙指标实战指南:从源码解析到精准安装 本文详细解析了通达信双紫擒龙指标的核心逻辑、源码获取与安全验证、安装流程及实战应用技巧。通过紫紫红黄四种颜色信号捕捉趋势转折点,结合MACD、布林通道和成交量加权算法,提升交易准确性。文章还提供了个性化设置、信号解读及常见问题解决方案,帮助投资者高效运用该指标。 阅读详情

相关推荐

SpringBoot与锐浪报表服务器深度整合实战指南

本文详细介绍了SpringBoot与锐浪报表服务器的深度整合实战指南,包括环境准备、Windows/Linux系统配置、核心功能实现代码解析及常见问题解决方案。通过具体案例和代码示例,帮助开发者高效完成报表系统的集成与部署,提升企业级应用的报表处理能力。

weixin_29238147的博客 365

桶思想

桶思想 班级里有nnn个同学,每个同学都有一个生日,老师想快速的知道有没有人的生日间隔在一个月内,该怎么做呢? 把每年365天分成12个月(就相当于12个桶),每个月(桶)内的生日都是满足的,并且相邻两个月也可能满足,除了这两种情况都不满足了。这就是桶思想。 例题 LeetCode 220 我们将整数范围内的值按照绝对值不大于ttt分桶,我们发现桶的大小为t+1t+1t+1即可,并且桶的元素最多有一个,因此我们可以使用哈希表实现。 特别的,注意计算桶的编号,负数需要先加111再减去111,保证结果计算正确。

jiahonghao2002的博客 726

LDO稳定性分析

根据补偿方式和拓扑结构的不同,三个极点之间的相互位置有可能发生变化,但 是 LDO 通常采用较大的输出电容 Cout,以及较大的调整管也会导致较大的 Cpar, 所以 p1、p2 通常位于较低的频率处,而 p3 和 z1 则由于 Resr较小会位于较高的频 率处。不过幸运的是,对于较大的 Cout来说,只要选择合适的 Resr,就可以将左半平面零点 Z1 的频率降低,甚至使 Z1 进入单位增益带宽内,左半平面零点的进入将对相位有所改善,这不仅可以消除振荡的风险,还可以在单位增益频率处得到较好的相位裕度。

模拟芯片设计 1586

5.计数排序、基数排序、桶排序

计数排序、基数排序、桶排序 文章目录计数排序、基数排序、桶排序1、计数排序(桶思想排序用的最多的一种)2、基数排序3、桶排序4、三种排序比较 桶思想,适用范围:量大但取值范围小。比如:如何快速得知高考名次?、某大型企业数万名员工年龄排序。 非比较排序。 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是O(n)。这些排序因为其待排序元素本身就含有了定位特征,因而不需要比较就可以确定其前后位置,从而可以突破比较排序算法时间复杂度O(nlgn)的理论下限。 1、计数排序(桶思想排序用的最多的一种)

wang_luwei的博客 274

从零到一:银河麒麟OS下C#跨平台开发的避坑指南

本文详细介绍了在银河麒麟OS下进行C#跨平台开发的完整流程,从开发环境搭建到避坑指南。针对国产操作系统特性,提供了.NET Core安装、开发工具链配置、桌面应用开发及部署优化的实战经验,特别关注ARM架构适配和性能调优,帮助开发者高效应对国产化开发挑战。

weixin_29221753的博客 859

(一)Tushare Pro教程:股票基本数据接口

 一直使用tushare作数据源,这里开个教程大家一起学习。 一、介绍        tushare是一个python股票数据源,现已升级到tushare pro版本,新版本在数据稳定性和获取速率上大幅提升。与wind、东财等收费数据源相比,tushare pro算是金融数据界的良心之作,其为从事金融工程、量化研究等方向的同学们提供了便利。tushare pro还有一点突出的特色就是已经将股票...

虎毛的博客 4万+

桶排序的思想

【引用】 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。       例

foxyaxin的专栏 1817

WRF实战:自定义Vtable解析ECMWF海温数据的关键步骤与技巧

本文详细介绍了在WRF模型中自定义Vtable以解析ECMWF海温数据的关键步骤与技巧。通过解剖GRIB文件、编写自定义Vtable条目以及配置METGRID.TBL,解决了ECMWF数据与WRF模型对接的难题,为海洋气象和台风模拟研究提供了高精度数据输入方案。

weixin_29279101的博客 331

洛谷 P1059 明明的随机数

题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了NN个11到10001000之间的随机整数(N≤100)(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 输入格式 输入有两行,第11行为11个正整数,表示所生成的随机数的个数NN 第22行有NN个用空格隔开的正整数,为所产生的随机数。 输出格式 输出也是两行,第11行

qq_37978559的博客 699

Qt —— 在Win11下“Qt for Android“开发环境,通过USB在真机(华为Meta60 PRO)上调试运行,并打包APK并在真实手机运行

Qt —— 在Win11下“Qt for Android“开发环境,打包APK并在真实手机运行

304

北京大学MuMo多模态肿瘤分类模型复现与迁移学习

本项目复现了北京大学MuMo多模态肿瘤分类模型,并针对特定医学影像数据集进行迁移学习。MuMo模型通过整合CT、MRI、PET等多模态医学影像数据,显著提升了肿瘤分类准确性。项目内容包括环境配置(Python 3.8+、PyTorch 1.9+)、数据预处理(DICOM/NIfTI格式处理、强度归一化)、多模态数据集类实现,以及训练验证测试集划分。关键特点是采用MONAI医学影像处理库,实现三维医学影像的标准化预处理流程,并支持多种模态数据的并行加载与联合训练,为后续模型复现和迁移学习奠定基础。

max500600的博客 1232

桶思想之运用

待定 1.任务调配 621. 任务调度器 用桶来演示,一共s轮,代表有s个桶,其中,每个桶都大于等于n+1(包括冷却) 装桶规则,在每个桶都大于n+1之前,尽量将每个桶都装满(也就是说每一轮中,不必将所有不同任务都过一遍),每个桶装大于n+1后,总耗时就是任务总数 int leastInterval(vector<char>& tasks, int n) { vector<int> dict(26,0); int res=...

小桥流水 401

Python爬虫实战:逆向解析天猫商品详情API,精准捕获规格、SKU与促销活动

及浏览器开发者工具),绕过前端渲染的复杂性,直接逆向分析并调用其内部数据接口,从而高效、稳定地抓取商品的关键信息,包括商品规格、多维度SKU信息以及复杂的促销活动。print(f"SKU ID: {sku.sku_id}, 价格: ¥{sku.price}, 库存: {sku.stock}, 规格: {sku.props}")当你访问一个商品链接时,浏览器首先会加载一个几乎为空的HTML骨架,然后通过执行大量的JavaScript代码,向后台服务器发起多个异步请求,最终将获取到的数据填充到页面中。

2201_76125261的博客 1123

桶思想相关的Leetcode题解

1512.好数对的数目 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。 返回好数对的数目。 示例 1: 输入:nums = [1,2,3,1,1,3] 输出:4 解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始 提示: 1 <= nums.length <= 100 1 <= nums[i] <= 100 public

零栀 170

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

2021/7/11 leetcode每日一题,H指数 桶的思想

首先我们来看一下7月11日的H指数 附原题传送门H指数 就题目本身而言其实是很简单的,只是对于文字理解上可能对于一部分人来说有困难(lc评论区都是吐槽题目文字的晦涩难懂),题目中的h指数,其实就是指作者文章有h篇文章被至少引用了h次。至少一次也就是一个向下包含的关系。我们首先看一下示例{3,0,6,1,5}数组中的值代表了没票文章被引用的次数。 通过观察我们不难发现有3篇文章的引用次数是大于3的,这句话可以等价于图一leetcode例题解释中的由于研究这有三篇论文每篇至少被引用了3次。解释中后一句的N-h

bonqiu的博客 194

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

力扣 621. 任务调度器

题目描述 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。 然而,两个相同种类的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。 你需要计算完成所有任务所需要的最短时间。 示例 1: 输入:tasks = ["A","A","A","B","B","B

团子大圆帅的博客 491

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

leetcode164. 最大间距 借桶思想秒掉hard题

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。 如果数组元素个数小于 2,则返回 0。 示例1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。 示例2: 输入: [10] 输出: 0 解释: 数组元素个数小于 2,因此返回 0。 说明: 你可以假设数组中所有元...

少说,多做。 4182

【力扣621. 任务调度器】桶思想python3

题目描述 https://leetcode-cn.com/problems/task-scheduler/ 思路题解 原来的思路,想着模拟一下,结果有测试用例死活过不了 class Solution: def leastInterval(self, tasks: List[str], n: int) -> int: if n==0:return len(tasks) m={} ans=0 for s in tasks:

戴某某 165

leetcode----621.任务调度器(模拟 和 桶思想两种解法)

621.任务调度器 问题:给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。 然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。 你需要计算完成所有任务所需要的 最短时间 。 示例: 输入:tasks = ["A","A","A",

Thomasc的博客 286

【困难】力扣算法题解析LeetCode220:存在重复元素Ⅲ

题目要求在数组 nums 中查找满足下标差 ≤ indexDiff 且元素值差 ≤ valueDiff 的下标对。采用 桶排序+滑动窗口 的优化方法: 桶划分:按 valueDiff + 1 的宽度分桶,同一桶内元素直接满足条件。 滑动窗口:维护大小为 indexDiff + 1 的窗口,确保下标差合法。 检查相邻桶:验证左右相邻桶中元素是否满足值差条件。通过 HashMap 存储桶,计算桶ID时处理负数,滑动窗口动态维护。

ylumwd的博客 541

220 存在重复元素 III(分桶、滑动窗口)

1. 问题描述: 在整数数组 nums 中,是否存在两个下标 i 和 j,使得nums [i] 和nums [j]的差的绝对值小于等于 t ,且满足 i 和 j 的差的绝对值也小于等于 ķ 。如果存在则返回 true,不存在返回 false。 示例1: 输入: nums = [1,2,3,1], k = 3, t = 0 输出: true 示例 2: 输入: nums = [1,0,1,1], k = 1, t = 2 输出: true 示例 3: 输入: nums = [1,5,9,...

二哈 388

「力扣」第 448 题:找到所有数组中消失的数字(桶的思想、哈希表、抽屉原理)

这一小节和大家分享的是「力扣」第 448 题:找到所有数组中消失的数字 的做法。 给定一个范围在 [1,n][1, n][1,n] ( nnn 为数组的大小) 的整型数组,数组中的元素有一些出现了两次,另一些只出现一次。 题目要求我们: 1、找到所有在 [1,n][1, n][1,n] 范围之间没有出现在数组中的数字。 2、您能在不使用额外空间且时间复杂度为 O(n)O(n)O(n) 的情况...

李威威的博客 666

Leetcode 第 394 场周赛题解

力扣第394场周赛全题解

qq_42979885的博客 824

力扣621.任务调度器

【代码】力扣621.任务调度器。

Pisasama的博客 477

LeeCode621任务调度器(Java)(填桶思想)

题目链接:LeeCode621任务调度器 题目描述: 开始想模拟一下任务调度,后来发现不是最优解,想了想最优解应该是先执行最多的任务,依次向最少的任务执行,例如:AAABBBCCCDDE执行顺序应该是ABCDABCDABCE等于12,最开始思路想错了写成了ABCABCABCDE空闲D等于13 然后又在题解学了填桶的思想,大神的题解 受益匪浅,就是用表格将最多的任务放在前面,作每行的头,之后将较少的任务填满该行,最后的格子数就是最优解,但是有一种情况就是种类过多,表格会变得不规律,无法计算正确答案,可以比限

weixin_43590593的博客 250

【LeetCode】面试题03. 数组中重复的数字(JAVA)

原题地址:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/ 题目描述: 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [...

rabbitsockx的博客 263
上一篇: LeetCode——双指针
下一篇: LeetCode——位运算
Kelvin____
博客等级 码龄9年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值