java - 在具有大值的排序数组中查找对
问题描述
我目前遇到一个问题,即在具有大值的排序数组中查找对。示例:如果我将数组 sortedarr=[1, 2, 2, 2, 2, 2, 2, 3] 作为输入。它应该返回对 = 15。
我编写了下面的代码,它在 O(N2) 中适用于未排序和排序的数组。但是代码非常基本,我希望它能够在更快的时间内管理排序数组。我想最简单的方法是将当前元素与它旁边的元素进行比较。但我不知道我该怎么做。我如何设法更改代码以使其满足我的要求?
public static int countpairs(int[] sortedarr) {
int N = sortedarr.length;
int pairs = 0;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
if (sortedarr[i] == sortedarr[j]) {
pairs++;
}
}
}
return pairs;
}
}
解决方案
这是在 O(N) 而不是 O(N^2) 中执行此操作的一种方法:
public static void main(String[] args) {
int[] a= new int[] {1, 2, 2, 2, 2, 2, 2, 3};
int i = 0;
int n = a.length;
int ans = 0;
while(i < n - 1) {
int dupeCount = 1;
while(i < n - 1 && a[i] == a[i + 1]) {
dupeCount++;
i++;
}
if(dupeCount > 1) {
ans = ans + (dupeCount * (dupeCount-1) / 2);
}
i++;
}
System.out.println(ans);
}
产出 15。
这个想法有点类似于冒泡排序使用的。我们只需要查看数组中的每一项及其后继项,看看它是否重复。从那里,可以创建的不同对的数量仅为C(dupeCount,2) = dupeCount * (dupeCount - 1) / 2
. 我们将所有此类事件相加得到最终答案。
推荐阅读
- sql - 为什么“不喜欢”不适用于 SQL 中的 OR
- excel - 试图让这个 VBA 代码运行得更快/可能更容易阅读和更新?
- haskell - 如何将 Data.Text.Internal.Text 转换为 Data.ByteString.Lazy.Bytestring(文本到 Lazy Bytestring)?
- python - 使用 Meta 中的默认字段和查询参数创建 Django 序列化程序
- post - 你好,我有一个比较简单的问题。如何使用 Passport 生成的 cookie“令牌”验证我是有效用户?
- linux - 构建错误无法加载文件或程序集 Microsoft.CodeAnalysis
- amazon-web-services - 尝试使用 codedeploy 将代码加载到 EC2 的自动可扩展组时出错
- css - 保持项目在拉伸的 div 内对齐
- json - Dart Angular 和 JSON 编码
- c# - 如何将文本框转换为十进制