是什么让这种方法比这种方法更好?

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