- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定一个包含 n 个唯一整数的数组 0 <= x_i < 2 * n。打印此数组中不存在的所有整数 0 <= x < 2 * n。
例子:
find_missing([0]) = [1]
find_missing([0, 2, 4]) = [1, 3, 5] # 因为所有数字都是[0, 1, 2, 3, 4, 5]
查找缺失([]) = []
find_missing([0, 1, 4, 5]) = [2, 3, 6, 7] # 因为所有数字都是[0, 1, 2, 3, 4, 5, 6, 7]
怪癖与要求有关:
时间复杂度 O(n) - 但是应该有一些独立于输入大小的固定常量 C,这样数组的每个元素都被写入/读取 < C 次,因此基数排序数组是不行的。
空间复杂度 O(1) - 你可以修改初始数组,但是 sorted(initial_array) 必须等于 sorted(array_after_executing_program) 并且你不能在这个数组中存储范围 [0, 2n) 之外的整数(假设它是一个uint32_t 数组)。
我看到了很多复杂的解决方案,但后来我发现了这个:
public void printNotInArr(int[] arr) {
if(arr == null)
return null;
int len = arr.length;
int max = 2 * len;
for(int i = 0; i < len; i++) {
System.out.println(max - arr[i] - 1);
}
}
我相信这是最好的解决方案,但我不确定。我想知道为什么那行不通。
最佳答案
正如@LasseV.Karlsen 所指出的,[0,3] 是一个简单的反例,它显示了该解决方案如何不起作用。然而,这是一个非常简单的解决方案(在 Python 中):
def show_missing(l):
n = len(l)
# put numbers less than n into the proper slot
for i in range(0,n):
while l[i]<n and l[i]!=i:
j = l[i]
l[i] = l[j]
l[j] = j
for i in range(0,n):
if l[i]!=i:
print('Missing %s'%i)
# put numbers greater than n into the proper slot
for i in range(0,n):
while l[i]>=n and l[i]!=i+n:
j = l[i]
l[i] = l[j-n]
l[j-n] = j
for i in range(0,n):
if l[i]!=i+n:
print('Missing %s'%(i+n))
这个想法很简单。我们首先重新排列元素,以便每个小于 n 的值 j 都存储在索引 j 处。然后我们可以遍历数组并轻松找出 n 以下缺失的数组。
然后我们重新排列元素,以便每个大于或等于 n 的值 j 都存储在索引 j-n 中。同样,我们可以遍历数组并轻松挑选出大于或等于 n 的缺失值。
由于只使用了几个局部变量,所以满足 O(1) 空间复杂度。
由于嵌套循环,O(n) 的时间复杂度有点难以看出,但不难证明我们永远不会交换超过 n 个元素,因为一个新元素被放入其适当的位置放置在每次交换中。
由于我们只是交换了数组的元素,所以所有原始元素仍在数组中的要求也得到满足。
关于arrays - 查找数组中缺失的数字,时间复杂度O(N),空间复杂度O(1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36532827/
多数元素问题: Given an array of size n, find the majority element. The majority element is the element tha
我有一个简单的问题来找到数组 A 中的第一个唯一元素。但是,令我困扰的是使用不同方法的时间复杂度。到目前为止,我已经尝试过这两种方法。 第一种方法: LinkedHashMap> map = new
STL 中valarray::min 和valarray::max 函数的时间复杂度是多少? 此外,什么是查找各种其他 STL 组件的时间/空间复杂性的良好来源? 最佳答案 O(N) 这些函数不会缓存
我目前正在学习复杂性(或效率,不管你怎么调用它),我在我得到的一本书中读到了它。写了一些我觉得很无意义的东西,我需要一个解释。我试过在线查找,但我没有找到他们给出的这个特定示例的答案。 For an
如何分析算法?是什么让快速排序具有 O(n^2) 的最坏情况性能,而合并排序具有 O(n log(n)) 的最坏情况性能? 最佳答案 这是整个学期的主题。最终,我们讨论的是在算法完成之前必须完成的操作
有谁知道最流行的数据库的 SQL LIKE 运算符的复杂度是多少? 最佳答案 让我们分别考虑三个核心案例。此讨论是特定于 MySQL 的,但也可能适用于其他 DBMS,因为索引通常以类似的方式实现。
Go 编程语言中这个循环的计算复杂度是多少? var a []int for i := 0 ; i doublecap { newcap = cap } else {
我需要创建一个查找函数,其中 (X,Y) 对对应于特定的 Z 值。对此的一个主要要求是我需要尽可能接近 O(1) 复杂度。我的计划是使用 unordered_map。 我通常不使用哈希表进行查找,因为
快速提问,主要满足我对该主题的好奇心。 我正在编写一些带有 SQlite 数据库后端的大型 python 程序,并且将来会处理大量记录,因此我需要尽可能优化。 对于一些功能,我正在通过字典中的键进行搜
Go 编程语言中这个循环的计算复杂度是多少? var a []int for i := 0 ; i doublecap { newcap = cap } else {
我有这个方法: public static int what(String str, char start, char end) { int count=0; for(int i=0;
for (i = 0; i i; j--) //some code that yields O(1) } 我认为上面的代码会产生 n*log(n) 但我看到另一个消息来源说它真的是 n^2
我对 InnoDB 中 OFFSET 的复杂性有疑问。我知道这主要适用于线性复杂性,但如果我在字段上有索引?! 示例: CREATE TABLE `person_rand` ( `p_id` int
我嵌套了一些 if/else 语句,但我想减少它们的开销。 在示例中,我正在评估从哪个下拉列表中单击了 li 项目,以及该 li 项目是否是第一个 (currentIndex === 0)。 代码:
这是我的第一个问题,所以我希望我没有违反任何规则。我终于设法为基数排序算法编写代码,但我想知道我是否做错了。让我觉得我的算法看起来复杂度为 O(n^3),但众所周知,基数排序是一个 O(k.n) 算法
几周前我认识了 big-O 并试图掌握它,但是尽管有很多关于计算时间复杂度的 Material ,但我似乎无法找到如何使算法更高效。 我一直在练习 Codility 中的演示挑战: Write a f
在最近的一次考试中,我们得到了一个函数来计算在未排序的 ArrayList 中出现了多少个 double (不是原始 double,而是一个项目出现两次的次数)。 我正确地确定了 Big O 复杂度为
以下循环的大 O 复杂度是多少: for each vertex u ∈ C do for each vertex v ∈ C and v > u do 我在这里做的是想象以下集合 {
我想对条款进行排序,使每个条款都是下一个条款的大 O √n√logn √n log( n^30) n/〖(logn)〗^2 〖16〗^(log√n) 谁能帮忙找到顺序? 最佳答案 claim :16
我正在尝试计算此选择排序实现的大 O 时间复杂度: void selectionsort(int a[], int n) { int i, j, mini
我是一名优秀的程序员,十分优秀!