【发布时间】:2020-06-06 19:41:01
【问题描述】:
我正在努力提高我的算法技能。我有一个非常简单的代码。
Qs:找出所有等于 0 的三元组(非重复)。
我认为时间复杂度是 O(nlogn) 与嵌套循环 (n^3) 无关。 我的理由是: 可以这么说
numslength = 3。然后代码运行 1 次。 {-1,0,-1}。
nums 长度 = 3。然后代码运行 1 次。 {-1,0,1,2} 然后代码运行 3 次。 -1,0,1, 01,0,2, -1,1,2.
类似地,当长度为 5 时,代码运行 6 次[] [] [] [] [] [],长度为 7 时运行 9 次。
所以看起来被考虑的三胞胎的数量增加了3(n-2),其中3<=n。因此,时间复杂度为n,因为3n-6 ~ n。
但是因为我有Arrays.sort,所以时间复杂度变成了O(nlogn)。
我忽略了什么?
int[] nums = { -1, 0, 1, 2, -1, -4};
List<List<Integer>> test = new ArrayList<List<Integer>>();
nums = new int[] { -1, 0, 1};
Arrays.sort(nums);
HashSet<String> duplicates = new HashSet<String> ();
for (int i = 0 ; i < nums.length - 2 ; i++) { //i->0 - 3
for (int j = i + 1; j < nums.length - 1; j++) { // j -> 1-4
for (int k = j + 1; k < nums.length; k++) { //k ->2-5
String sInt = nums[i] + "" + nums[j] + "" + nums[k];
if ((nums[i] + nums[j] + nums[k]) == 0 && !duplicates.contains(sInt)) {
ArrayList<Integer> t = new ArrayList<Integer> ();
t.add(nums[i]);
t.add(nums[j]);
t.add(nums[k]);
test.add(t);
}
duplicates.add(sInt);
}
}
}
return test;
【问题讨论】:
-
@Emma 我一直在阅读有关解决问题的人的信息。他们说这是 n ^3 (n 立方时间),因为有 3 个嵌套循环。所以我认为我做错了什么。但不确定我做错了什么..例如..看看这个教程:youtube.com/watch?v=u9XPajMee1s
-
所以我对 nlogn 的看法是正确的,而视频中的人是错误的?
-
正在尝试......
标签: algorithm time-complexity runtime big-o