是什么让这种方法比这种方法更好?
What makes this approach better than this one?
唯一的区别是第一个循环中的嵌套 for 循环被赋予 i+1 的值而不是 +1(第二个)。为什么第一个比第二个好?
int[] nums = { 3, 2, 4 };
int target = 6;
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int answer = nums[i]+nums[j];
System.out.println(answer);//answer should be value of target
}
}
int[] nums = { 3, 2, 4 };
int target = 6;
for (int i = 0; i < nums.length; i++ ) {
for (int j = 1; j < nums.length; j++) {
int answer = nums[i]+nums[j];
System.out.println(answer);//answer should be value of target
}
}
这两个代码对我来说似乎并不相同。然而正如你在评论中所说,我正在努力弄清楚。
就运行次而言,在第一个代码中,nested for loop
运行s nums.length - (i+1)
次。这是嵌套 for 循环 运行s 0
次和最坏情况 运行snums.length - 1
次的最佳情况。
int[] nums = { 3, 2, 4 };
int target = 6;
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int answer = nums[i]+nums[j];
System.out.println(answer);//answer should be value of target
}
}
另一方面,在第二个代码中 nested for loop
运行s nums.length
次。这里 nested for loop
的最佳情况和最坏情况是相同的,即 运行 次 nums.length
次。
int[] nums = { 3, 2, 4 };
int target = 6;
for (int i = 0; i < nums.length; i++ ) {
for (int j = 1; j < nums.length; j++) {
int answer = nums[i]+nums[j];
System.out.println(answer);//answer should be value of target
}
}
因此,基于best and worst case scenario
我们可以说第一个代码更有效。
第一个代码示例中的迭代次数是序列的总和:n - 1, n - 2, ... 1
即它是n - 1
个元素的等差数列的总和:
S = (1 + n - 1) * (n - 1) / 2 = n * (n - 1) / 2 = (n^2 - n) / 2
第二个代码示例中的迭代次数为n * (n - 1) = n^2 - n
,即它的迭代次数是第一个代码示例的两倍。
然而,在估计复杂度(big-O)时,常量值如2和低阶表达式被忽略,因此在这两种情况下O(N) = N^2
。
唯一的区别是第一个循环中的嵌套 for 循环被赋予 i+1 的值而不是 +1(第二个)。为什么第一个比第二个好?
int[] nums = { 3, 2, 4 };
int target = 6;
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int answer = nums[i]+nums[j];
System.out.println(answer);//answer should be value of target
}
}
int[] nums = { 3, 2, 4 };
int target = 6;
for (int i = 0; i < nums.length; i++ ) {
for (int j = 1; j < nums.length; j++) {
int answer = nums[i]+nums[j];
System.out.println(answer);//answer should be value of target
}
}
这两个代码对我来说似乎并不相同。然而正如你在评论中所说,我正在努力弄清楚。
就运行次而言,在第一个代码中,nested for loop
运行s nums.length - (i+1)
次。这是嵌套 for 循环 运行s 0
次和最坏情况 运行snums.length - 1
次的最佳情况。
int[] nums = { 3, 2, 4 };
int target = 6;
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int answer = nums[i]+nums[j];
System.out.println(answer);//answer should be value of target
}
}
另一方面,在第二个代码中 nested for loop
运行s nums.length
次。这里 nested for loop
的最佳情况和最坏情况是相同的,即 运行 次 nums.length
次。
int[] nums = { 3, 2, 4 };
int target = 6;
for (int i = 0; i < nums.length; i++ ) {
for (int j = 1; j < nums.length; j++) {
int answer = nums[i]+nums[j];
System.out.println(answer);//answer should be value of target
}
}
因此,基于best and worst case scenario
我们可以说第一个代码更有效。
第一个代码示例中的迭代次数是序列的总和:n - 1, n - 2, ... 1
即它是n - 1
个元素的等差数列的总和:
S = (1 + n - 1) * (n - 1) / 2 = n * (n - 1) / 2 = (n^2 - n) / 2
第二个代码示例中的迭代次数为n * (n - 1) = n^2 - n
,即它的迭代次数是第一个代码示例的两倍。
然而,在估计复杂度(big-O)时,常量值如2和低阶表达式被忽略,因此在这两种情况下O(N) = N^2
。