三数之和问题|豆包MarsCodeAI刷题

76 阅读2分钟

解题思路

  1. 排序数组:首先对数组进行排序,这样可以方便地使用双指针技术来查找满足条件的 i, j, k
  2. 三重循环:使用三重循环来遍历所有可能的 i, j, k 组合。
  3. 双指针技术:在第三重循环中,使用双指针技术来优化查找过程,减少时间复杂度。
  4. 计数器:使用一个计数器来记录满足条件的元组数量。
  5. 取模操作:在每次计数时,对结果进行取模操作,以防止溢出。
import java.util.Arrays;

public class Main {
    public static int solution(int[] arr, int t) {
        // 对数组进行排序
        Arrays.sort(arr);
        
        int count = 0;
        int mod = 1000000007;
        
        // 三重循环遍历所有可能的 i, j, k 组合
        for (int i = 0; i < arr.length - 2; i++) {
            for (int j = i + 1; j < arr.length - 1; j++) {
                int k = j + 1;
                // 使用双指针技术优化查找过程
                while (k < arr.length) {
                    int sum = arr[i] + arr[j] + arr[k];
                    if (sum == t) {
                        // 找到满足条件的元组,增加计数器
                        count = (count + 1) % mod;
                    }
                    k++;
                }
            }
        }
        
        return count;
    }

    public static void main(String[] args) {
        System.out.println(solution(new int[]{1, 1, 2, 2, 3, 3, 4, 4, 5, 5}, 8) == 20);
        System.out.println(solution(new int[]{2, 2, 2, 2}, 6) == 4);
        System.out.println(solution(new int[]{1, 2, 3, 4, 5}, 9) == 2);
        System.out.println(solution(new int[]{1, 1, 1, 1}, 3) == 4);
    }
}

关键步骤

  1. 排序数组:使用 Arrays.sort(arr) 对数组进行排序。
  2. 三重循环:使用三重循环遍历所有可能的 i, j, k 组合。
  3. 双指针技术:在第三重循环中,使用双指针技术来优化查找过程。
  4. 计数器:使用一个计数器来记录满足条件的元组数量,并在每次计数时对结果进行取模操作。

解释

  • 排序数组:排序数组可以方便地使用双指针技术来查找满足条件的 i, j, k
  • 三重循环:通过三重循环遍历所有可能的 i, j, k 组合,确保不遗漏任何可能的元组。
  • 双指针技术:在第三重循环中,使用双指针技术来优化查找过程,减少时间复杂度。
  • 计数器:使用一个计数器来记录满足条件的元组数量,并在每次计数时对结果进行取模操作,以防止溢出。

总结

通过这些步骤,你可以逐步实现代码,解决这个问题。如果有任何问题或需要进一步的帮助,请随时告诉我!