首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

获取数组中最小k数字_29

思路:利用小根堆 面试或者其他啥情况估计是不允许大家直接用优先级队列,所以我们还是老老实实实现一个堆结构吧; 关于堆结构以及其相应实现大家可以看我之前一个笔记https://www.jianshu.com.../writer#/notebooks/40413732/notes/55370532 我们这里普通堆排序堆数据修改有一点区别,那就是这里我们需要先实现一个小根堆,然后每一次拿第一个数据然后把这个数据删掉...,但是我们这里存在一个问题,数组不太好删数据,删除的话要进行一个所有数据前移,因此, 我这里取了个巧,我把第一个数字最后一个数字交换,然后我当这个数组长度减了1,当最后一个数字不存在,然后会进行一个从顶到下重建...,同理第二大数字出来后与倒数第二个交换,当倒数第二个数就不存在了,以此类推。。。...} public int rightChild(int parentIndex) { return 2 * parentIndex + 2; } 同理这里也把拿最大k

40010
您找到你想要的搜索结果了吗?
是的
没有找到

LeetCode刷题——两个数组交集丢失数字

两个数组交集 来源:力扣(LeetCode) 链接:力扣 给定两个数组 nums1 nums2 ,返回 它们交集 。输出结果每个元素一定是 唯一 。我们可以 不考虑输出结果顺序 。...来源:力扣(LeetCode) 链接:力扣 给定一个包含 [0, n] n 个数数组 nums ,找出 [0, n] 这个范围内没有出现在数组那个数。...示例 2: 输入:nums = [0,1] 输出:2 解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失数字,因为它没有出现在 nums 。...8 是丢失数字,因为它没有出现在 nums 。 示例 4: 输入:nums = [0] 输出:1 解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。...1 是丢失数字,因为它没有出现在 nums

28830

数组只出现一次两个数字_40

题目描述 一个整型数组里除了两个数字只出现一次,其他数字都出现了两次。请写程序找出这两个只出现一次数字。...示例1 输入 [1,4,1,6] 返回值 [4,6] 说明 返回结果较小数排在前面 思路: 1.首先全数组异或找出这个数组不同两个数字异或结果 initNum 原理:相同数字异或结果为0...(异或 每一位同则置0不同则取1) 2.由于异或结果是我们要求两个不同数字异或结果,那么我们可以找到最后一个1位置,这两个数在此位置上必然一个是0一个是1(异或特性). 3.找到最后可以1位置后...,利用两个数字在此位置上必然是一个是0一个是1,我们可以利用与特性区分这两个数字位置.另外其他相同数字不管落在数组哪个位置上,两个相同数字异或结果必然是0,因此最后落到我们数组必然两个不同数字...//先亦或一波,求出数组只出现过一次数字亦或结果 int initNum=array[0]; for (int i = 1; i < array.length

68610

输入一个已经按升序排序过数组一个数字,在数组查找两个数,使得它们正好是输入那个数字

题目: 输入一个已经按升序排序过数组一个数字, 在数组查找两个数,使得它们正好是输入那个数字。 要求时间复杂度是O(n)。如果有多对数字等于输入数字,输出任意一对即可。...思路: 1 第一种思路,可以把数字存在数组里,比如数组中最大值是15,那么就开一个长度未15数组1 存在a[1]里 15存在a[15]里;这样用15-a[1]判断里面是否有值就可以了。...;或者tail大于head为止; 代码如下: ''' 题目:输入一个已经按升序排序过数组一个数字, 在数组查找两个数,使得它们正好是输入那个数字。...如果有多对数字等于输入数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出411。...K个最小

2.1K10

2022-07-07:原本数组中都是大于0、小于等于k数字,是一个单调不减数组, 其中可能有相等数字,总体趋势是递增

2022-07-07:原本数组中都是大于0、小于等于k数字,是一个单调不减数组, 其中可能有相等数字,总体趋势是递增。...但是其中有些位置数被替换成了0,我们需要求出所有的把0替换方案数量: 1)填充一个数可以大于等于前一个数,小于等于后一个数; 2)填充一个数不能大于k。 来自腾讯音乐。...= ways1(&mut arr, k); let ans2 = ways2(&mut arr, k); if ans1 !...as usize]; i = j; } i += 1; } return res; } // 数学方法 // a ~ b范围数字随便选...,可以选重复数,一共选m个 // 选出有序序列方案数:C ( m, b - a + m ) fn ways2(nums: &mut Vec, k: i64) -> i64 { let

61720

2022-07-07:原本数组中都是大于0、小于等于k数字,是一个单调不减数组,其中可能有相等数字,总体趋势是递增。但是

2022-07-07:原本数组中都是大于0、小于等于k数字,是一个单调不减数组, 其中可能有相等数字,总体趋势是递增。...但是其中有些位置数被替换成了0,我们需要求出所有的把0替换方案数量: 1)填充一个数可以大于等于前一个数,小于等于后一个数; 2)填充一个数不能大于k。 来自腾讯音乐。...= ways1(&mut arr, k); let ans2 = ways2(&mut arr, k); if ans1 !...as usize]; i = j; } i += 1; } return res; } // 数学方法 // a ~ b范围数字随便选...,可以选重复数,一共选m个 // 选出有序序列方案数:C ( m, b - a + m ) fn ways2(nums: &mut Vec, k: i64) -> i64 { let

17620

每日一题《剑指offer》数组篇之数组只出现一次两个数字

今日题目链接:数组只出现一次两个数字 数组只出现一次两个数字 难度:中等 描述 一个整型数组里除了两个数字只出现一次,其他数字都出现了两次。请写程序找出这两个只出现一次数字。...但是,借助这种思路,我们可以进一步分析,如果我们能把数组分成两个数组,使每个子数组包含一个只出现一次数字,而其他数字成对出现,那么我们通过上述解法就可以找到两个元素。...接下来, 以第n位是不是1为标准,将数组分为两个数组,  第一个数组第n位都是1,第二个数组第n位都是0。这样,便实现了我们目标。最后,两个数组分别异或则可以找到只出现一次数字。...接下来只要分别两个数组求异或,就能找到第一个数组只出现一次数字是6,而第二个子数组只出现一次数字是4。...分别用来保存两个不同数,作为返回结果。

18120

2021-06-16:返回一个数组,选择数字不能相邻情况下, 最大子序列累加

2021-06-16:返回一个数组,选择数字不能相邻情况下, 最大子序列累加。 福大大 答案2021-06-16: 方法一:自然智慧。递归。 方法二:动态规划。...思路: 定义dpi : 表示arr0...i范围上,在不能取相邻数情况下,返回所有组合最大累加 在arr0...i范围上,在不能取相邻数情况下,得到最大累加,可能性分类: 可能性 1) 选出组合...getMax(a int, b int) int { if a > b { return a } else { return b } } // 给定一个数组...arr,在不能取相邻数情况下,返回所有组合最大累加 // 思路: // 定义dp[i] : 表示arr[0...i]范围上,在不能取相邻数情况下,返回所有组合最大累加 // 在arr[0.....i-2]范围上累加

58610

2021-06-16:返回一个数组,选择数字不能相邻情况下, 最大子序列累加

2021-06-16:返回一个数组,选择数字不能相邻情况下, 最大子序列累加。 福大大 答案2021-06-16: 方法一:自然智慧。递归。 方法二:动态规划。...思路: 定义dp[i] : 表示arr[0...i]范围上,在不能取相邻数情况下,返回所有组合最大累加 在arr[0...i]范围上,在不能取相邻数情况下,得到最大累加,可能性分类: 可能性...getMax(a int, b int) int { if a > b { return a } else { return b } } // 给定一个数组...arr,在不能取相邻数情况下,返回所有组合最大累加 // 思路: // 定义dp[i] : 表示arr[0...i]范围上,在不能取相邻数情况下,返回所有组合最大累加 // 在arr[0.....i-2]范围上累加

70030

2023-07-17:给定一个数组arr,长度为n, 再给定一个数字k,表示一定要将arr划分成k个集合, 每个数字只能进一个

2023-07-17:给定一个数组arr,长度为n, 再给定一个数字k,表示一定要将arr划分成k个集合, 每个数字只能进一个集合。 返回每个集合内部平均值都累加起来最小值。 平均值向下取整。...答案2023-07-17: 算法1(minAverageSum1): 1.定义一个结构体Info,包含两个字段:sum表示集合内所有元素,cnt表示集合内元素个数。...2.定义函数minAverageSum1(arr []int, k int) int,接收数组arr整数k作为参数,返回最小平均值累加。 3.若数组arr长度小于k返回-1。...6.函数process(arr []int, i int, k int, sets []Info) int表示将arr数组从索引i开始元素划分到sets集合返回最小平均值累加。...2.若数组arr长度小于k返回-1。 3.对数组arr进行升序排序。 4.初始化ans为0,用于记录平均值累加结果。 5.遍历排序后arr数组,从索引0到k-2。

22040

2023-06-02:给定一个二进制数组 nums 一个整数 kk位翻转 就是从 nums 中选择一个长度为 k 数组, 同时把子数组一个 0

2023-06-02:给定一个二进制数组 nums 一个整数 kk位翻转 就是从 nums 中选择一个长度为 k 数组,同时把子数组一个 0 都改成 1 ,把子数组一个 1 都改成...返回数组不存在 0 所需最小 k位翻转 次数。如果不可能,则返回 -1。子数组数组 连续 部分。输入:nums = 0,1,0, K = 1。输出:2。...3.循环遍历数组 nums 每个元素 num:如果队列 queue 存在元素,并且当前元素下标减去队列左端点下标等于 k,则说明队列一个元素已经过期,将左端点右移一位。...4.如果队列 queue 长度大于 0 且队列最后一个元素下标加 k 大于数组长度,则返回 -1 表示无法完成翻转;否则,返回翻转次数 ans。...需要注意是,在 C C++ ,使用指针代替数组时需要手动分配释放内存,因此还需要额外空间来存储指向动态分配内存指针。

49220
领券