当前位置: 首页 > 知识库问答 >
问题:

Leetcode:计算时间复杂度为O(n)的元素

松旭
2023-03-14

给定一个整数数组arr,计算元素x,使得x 1也在arr中。如果arr中有重复项,请分别计数。

示例1:输入:arr=[1,2,3]输出:2说明:1和2被计数,因为2和3在arr中。

示例2:输入:arr=[1,1,2]输出:2解释:1计数两次,原因2在arr中。

示例3:输入:arr=[1,1,3,3,5,5,7,7]输出:0说明:没有计算数字,因为arr中没有2、4、6或8。

示例4:输入:arr=[1,1,2,2]输出:2解释:两个1被计数,因为2在arr中。

MyCode:(仅对示例2不起作用(目前))

int count = 0;
HashSet set = new HashSet();
for(int i=0;i<arr.length;i++) {
    if(set.contains(arr[i]-1) || set.contains(arr[i]+1)) {
        count++;
        set.add(arr[i]);
    }else {
        set.add(arr[i]);
    }
}
return count;

共有3个答案

朱季
2023-03-14

简单解决方案

class Solution:
    def countElements(self, arr: List[int]) -> int:
        c=0
        for i in arr:
         if(i+1 in arr):
                c+=1
        if(c>0):
            return c
        else:
            return 0```
昌琪
2023-03-14

Swift解决方案O(n)

class Solution {
    func countElements(_ arr: [Int]) -> Int {
        var arrSet = Set(arr)
        var result = 0

        for num in arr {
            if arrSet.contains(num+1) {
                result += 1
            }
        }
        return result
    }
}
宋典
2023-03-14

你为什么要数arr[i]-1?。条件已设置。包含(arr[i]1)足够按照定义计算。

我想你是想一次就达到这个目标。这不起作用,因为您还必须计算重复发生的次数。

如果输入的顺序不同,示例2将起作用。例:[2,1,1]。您的解决方案更像是计算arr[i]1s,而不是计算这些数字本身。

这是我的代码2通:

class Solution {
    public int countElements(int[] arr) {
        Set<Integer> lookup = new HashSet<>();
        for(Integer i: arr){
            lookup.add(i);
        }
        
        int count =0;
        
        for(Integer i:arr){
            if(lookup.contains(i+1)){
                count++;
            }
        }
        return count;
    }
}
  1. 将所有元素添加到集合。这具有O(n)的复杂性,并有助于O(1)查找。
  2. 遍历数组,查看该元素是否存在于集合中。复杂度为O(n)*O(1)即O(n)

虽然我们迭代数组两次,但时间复杂度将为O(n)。

 类似资料:
  • 描述一个O(n logn)-时间算法,给定一组由n个整数和另一个整数x组成的S,该算法确定S中是否存在两个元素,其和正好是x。 我计划用二进制搜索来搜索这个。 我如何找到这个算法的时间复杂度?如果T(n)不是(n log n),正确的算法是什么?

  • 做O(h)算法的时间复杂度是多少?当h是节点的高度,以BST n倍为单位(树中的元素数),我相信是O(n),而不是O(n*h),但我不知道如何证明它。 在O(h)中工作的特定算法是在BST中查找元素的顺序前体。

  • 在最近的一次测试中,我们得到了一个函数来计算未排序的ArrayList中出现了多少个double(不是原语double,而是一个项目出现了两次)。 我正确地确定了Big O复杂度为O(N^2),但由于我错误地确定了全部复杂度,因此只获得了部分学分。函数如下: 在他刚刚发布的考试解决方案中,他给出了这样的解释: 输入集合中有N个项,该方法通过一个缩减步骤反复调用自己,该步骤生成一个新索引N次,直到达

  • 查找p的伪码算法为: 假设我有一个int值的数组H[1到m],其中“p”是峰值元素,如果: 基本上,如果H【p】大于或等于其相邻元素,则H【p】为峰值。 假设数组H在开始和结束时都大于1个元素,数组为H[0到m 1],其中H[0]=H[m 1]=无穷大。因此,H[0]和H[m 1]是哨兵。然后是元素p,其中1≤ p≤ n、 是一个峰值,如果H【p-1】≤ H【p】≥ H【p 1】。 我认为渐近时间

  • 输入: 简单地说,复杂度是不是3*(len(ab)+4*(len(c)),我说的对吗?