首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >给定一个大小为n+1的整数数组,该数组由元素[1,n]组成。除k次重复的元素外,所有元素都是唯一的。

给定一个大小为n+1的整数数组,该数组由元素[1,n]组成。除k次重复的元素外,所有元素都是唯一的。
EN

Stack Overflow用户
提问于 2022-06-03 12:20:23
回答 4查看 915关注 0票数 1

我一直试图解决以下问题:

您将得到一个n+1整数数组,其中所有元素都位于[1,n]中。您还会得到其中一个元素被重复了一定次数,而其他元素则是不同的。开发一种算法,以同时找到重复的数字和重复的次数。

下面是我的解决方案,让k=重复次数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct LatticePoint{ // to hold duplicate and k
   int a;
   int b;
   LatticePoint(int a_, int b_) : a(a_), b(b_) {}
   }
   
LatticePoint findDuplicateAndK(const std::vector<int>& A){

int n = A.size() - 1;
std::vector<int> Numbers (n);

for(int i = 0; i < n + 1; ++i){
   ++Numbers[A[i] - 1]; // A[i] in range [1,n] so no out-of-access
   }
   
int i = 0;
while(i < n){
   if(Numbers[i] > 1) {
      int duplicate = i + 1;
      int k = Numbers[i] - 1;
      LatticePoint result{duplicate, k};
      return LatticePoint;
}

因此,基本思想是:我们沿着数组,每次看到数字A[i],就会增加Numbers[A[i]]的值。由于只有重复出现过一次以上,所以数值大于1的数字输入的索引必须是具有重复次数的重复数- 1. O(n)在时间复杂度上和空间上的O(n)算法。

我想知道是否有人有更好的时间和/或空间的解决方案?(或者实际上如果我的解决方案中有任何错误.)

EN

回答 4

Stack Overflow用户

发布于 2022-06-03 17:13:07

如果您有或愿意编写一个运行时指定大小的n (请参阅boost::dynamic_bitset),则可以将划痕空间缩减为n int,而不是nint

您不需要收集重复计数,直到您知道哪个元素是重复的,然后您只需要保持该计数。因此,您需要跟踪的是您以前是否见过该值(因此,n位)。找到复制的值后,将count设置为2,并在向量的其余部分中运行,每次单击该值的实例时递增count。(您将count初始化为2,因为当您到达那里时,您将看到其中的两个。)

这仍然是O(n)空间,但常数因子要小得多。

票数 2
EN

Stack Overflow用户

发布于 2022-06-03 13:03:40

你的代码的想法是可行的。

但是,多亏了n+1元素,我们可以实现时间和空间的其他权衡。

如果我们有一定数量的桶,我们将数字除以,将n+1数放入其中,这意味着一些桶必须得到比预期更多的数据。这是众所周知的针孔原理的一个变体.

所以我们使用两个桶,一个用于范围1..floor(n/2),一个用于floor(n/2)+1..n。经过一遍数组后,我们知道答案在哪一半。然后我们把这一半分成两半,再过一遍,以此类推。这将导致二进制搜索,该搜索将获得O(1)数据的答案,with ceil(log_2(n))通过,每个搜索都需要时间O(n)。因此,我们在时间O(n log(n))中得到了答案。

现在我们不需要用两个水桶了。如果我们使用3,我们将采取ceil(log_3(n))通行证。因此,当我们增加固定数量的桶时,我们会占用更多的空间并节省时间。还有其他的取舍吗?

好吧,您展示了如何使用n桶在1次传递中做到这一点。你需要多少桶才能在两次传球中完成?结果,答案至少是sqrt(n)的口头禅。用立方体根可以进行3次传递。诸若此类。

所以你会得到一系列的权衡,你拥有的桶越多,你需要的空间就越多,但传球越少。而你的解决方案只是在极端的尽头,占用了最多的空间和最少的时间。

票数 1
EN

Stack Overflow用户

发布于 2022-06-03 22:17:41

这是一个更厚颜无耻的算法,它只需要恒定的空间,但需要重新排列输入向量。(它只是重新排序;所有原始元素在末尾仍然存在。)

现在仍然是O(n)时间,尽管这可能不是很明显。其想法是尝试重新排列数组,使Ai是我,直到我们找到复制。当我们尝试将一个元素放在正确的索引上时,这个重复就会出现,结果是这个索引已经保存了那个元素。这样,我们就找到了复制;我们有一个要移到Aj的值,但是相同的值已经在Aj了。然后,我们扫描数组的其余部分,每次找到另一个实例时都会增加计数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <utility>
#include <vector>
std::pair<int, int> count_dup(std::vector<int> A) {
  /* Try to put each element in its "home" position (that is,
   * where the value is the same as the index). Since the
   * values start at 1, A[0] isn't home to anyone, so we start
   * the loop at 1.
   */
  int n = A.size();
  for (int i = 1; i < n; ++i) {
    while (A[i] != i) {
      int j = A[i];
      if (A[j] == j) {
        /* j is the duplicate. Now we need to count them.
         * We have one at i. There's one at j, too, but we only
         * need to add it if we're not going to run into it in
         * the scan. And there might be one at position 0. After that,
         * we just scan through the rest of the array.
         */
        int count = 1;
        if (A[0] == j) ++count;
        if (j < i) ++count;
        for (++i; i < n; ++i) {
          if (A[i] == j) ++count;
        }
        return std::make_pair(j, count);
      }
      /* This swap can only happen once per element. */
      std::swap(A[i], A[j]);
    }
  }
  /* If we get here, every element from 1 to n is at home.
   * So the duplicate must be A[0], and the duplicate count
   * must be 2.
   */
  return std::make_pair(A[0], 2);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72494796

复制
相关文章
Python中lambda(),filter(),map()函数
参考链接: Python lambda (匿名函数) | filter, map, reduce
用户7886150
2021/01/12
1K0
如何使用Python的lambda、map和filter函数
Python lambda函数,又称匿名函数,与我们使用def…语句创建的函数不同,可以命名函数,lambda函数不需要名称。当需要一个快速且不需要经常重复使用的(通常是一个小的)函数时,它非常有用。单独使用Lambda函数可能没有太多意义。lambda函数的价值在于它在哪里与另一个函数(例如map()或filter())一起使用。
fanjy
2022/06/04
2.1K0
如何使用Python的lambda、map和filter函数
针对map的lambda
例如原来的: Steam.of(Maps.of("foo", "bar")) .map(e -> e.getKey() + e.getValue()) .findFirst(); 现在 Steam.of(Maps.of("foo", "bar")) .map(SerFunc.entryFunc((key, value) -> key + value)) .findFirst();
阿超
2023/05/22
2190
python map()函数和lambda表达式
python map(fun,[arg]+)函数最少有两个参数,第一参数为一个函数名,第二个参数是对应的这个函数的参数(一般为一个或多个list)。
用户7886150
2021/01/25
6090
lambda与函数式
前面两篇文章介绍了什么是响应式编程?和响应式流的特性,一味讲概念终是枯燥,还是上手敲一敲代码实在感受一下响应式编程的“手感”吧。
Java3y
2019/10/23
5270
lambda与函数式
1.3 Hello,reactive world 前面两篇文章介绍了响应式编程和响应式流的特性,一味讲概念终是枯燥,还是上手敲一敲代码实在感受一下响应式编程的“手感”吧。 (3)lambda与函数式——响应式Spring的道法术器 这一节,我们先了解一下lambda与函数式(已经了解的朋友可以直接跳到1.3.2),熟悉一下如何使用Reactor进行响应式编程,然后使用Spring Boot2,基于Spring 5的Webflux和Reactive Spring Data逐步开发一个“Hello world”
IT架构圈
2018/06/01
5040
【Python】函数进阶 ④ ( Lambda 匿名函数 | 具名函数与匿名函数 | Lambda 函数定义语法 )
在 Python 中 , 使用 def 关键字定义的函数 是 " 具名函数 " , 也就是有名字的函数 ;
韩曙亮
2023/10/11
3390
【Python】函数进阶 ④ ( Lambda 匿名函数 | 具名函数与匿名函数 | Lambda 函数定义语法 )
强大的匿名函数lambda使用方法,结合map、apply等
在Python中,lambda的语法形式如下: lambda argument_list: expression lambda是Python预留的关键字,argument_list和expression由用户自定义。
自学气象人
2022/11/14
1.6K0
强大的匿名函数lambda使用方法,结合map、apply等
Python的lambda表达式、filter、map、reduce等函数的用法
参考链接: Python lambda (匿名函数) | filter, map, reduce
用户7886150
2021/01/12
9590
[Python]中filter、map、reduce、lambda的用法
原文链接:http://blog.csdn.net/humanking7/article/details/45950985
祥知道
2020/03/10
6410
[编程经验]Python中的Lambda,Map, Reduce小结
今天要和大家分享的是Python匿名函数(anonymous functions),也叫lambda函数。匿名函数的意思就是说这个函数没有显式的函数名,因为一般在Python中定义函数的时候都是这个样子的,def function_name(参数列表): balabalaba。暂且把具有function_name的函数称作常规函数,而匿名函数就称作lambda函数。匿名函数没有显式的函数名,但是有显式的lambda标志,写了lambda的函数就可以称作匿名函数。一般情况大家不愿意用匿名函数(因为他 们不会用
用户1622570
2018/04/11
8500
python中的zip、lambda、map操作
python 中有几个比较酷炫的操作,比如:zip、lambda、map 一、zip操作 zip字面意思:拉链。这么记,把几个东西扔到一个包里,拉上拉链,就算打包好了。通俗点讲,就是把第1个参数,与第2个参数,按位置1个个对齐,组成一系列元组. x = (1, 2) y = ("a", "b") zip_result = zip(x, y) print(list(zip_result)) x = [4, 5, 6] y = ['d', 'e'] zip_result = zip(x, y) print(
菩提树下的杨过
2018/04/16
1K0
lambda函数
lambda函数就是我们常说的匿名函数,就是不用定义函数名,lambda更像是一个表达式,限制了程序的嵌套,是一个为编写简单的函数而设计的。
dogfei
2020/07/31
9340
python的lambda函数
在Python中,lambda函数是一种匿名函数,也被称为"小型"或"即时"函数。与常规的函数不同,lambda函数没有名称,并且通常用于单行代码的简单功能。它们的语法如下:
叶茂林
2023/07/30
2450
set map list 之间的关联关系
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/17
4640
set map list 之间的关联关系
详细讲解:python中的lambda与sorted函数
python中的lambda函数可以接受任意数量的参数,但只能有一个表达式。也就是说,lambda表达式适用于表示内部仅包含1行表达式的函数。那么lambda表达式的优势就很明显了:
计算机与AI
2020/12/14
2.8K0
详细讲解:python中的lambda与sorted函数
java8之后的List与Map遍历(Lambda 表达式)
不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
向着百万年薪努力的小赵
2022/12/01
6740
【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )
在 PySpark 中 RDD 对象 提供了一种 数据计算方法 RDD#map 方法 ;
韩曙亮
2023/10/11
7380
【Python】PySpark 数据计算 ① ( RDD#map 方法 | RDD#map 语法 | 传入普通函数 | 传入 lambda 匿名函数 | 链式调用 )
学习LAMBDA函数:将Excel公式转换为自定义函数(下)
引言:本文学习整理自microsoft.com,LAMBDA的真正的解决了Excel公式存在的先天不足,让Excel公式真正的强大起来了。
fanjy
2023/02/16
2.5K0
学习LAMBDA函数:将Excel公式转换为自定义函数(下)
点击加载更多

相似问题

Ethereum闹钟还活着吗?

30

钱包格栅攻击还存在吗?

10

紫红色的纸还真的吗?

10

瓦斯用完了,还能还吗?

10

坚固的还绳不十六进制吗?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文