首页 > 试题广场 >

寻找三元组

[编程题]寻找三元组
  • 热度指数:447 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

给定一个不存在重复元素的数组,输出其中所有满足a + b = c 的三元组 <a, b, c> 个数。

示例1

输入

[1, 8, 9, 10]

输出

2

说明

包含2 个三元组 <1, 8, 9>, <1, 9, 10>

示例2

输入

[7, 6, 5]

输出

0

说明

不存在任何三元组

做的时候没考虑到负数的情况。。。。肯定有很多人和我一样

考虑负数我感觉只能全部遍历一遍了
我这写法应该会有重复的问题,但不知为何可以过。
import java.util.*;


public class Solution {
        public int NumberOfTriplets (int[] nums) {
            int res = 0, n = nums.length;
            Arrays.sort(nums);
            for (int i = 0; i < n; i++) {
                int lo = 0, hi = n - 1;

                while (lo < hi) {
                    if (lo == i) lo++;
                    else if (hi == i) hi--;
                    if (lo >= hi) break;
                    int sum = nums[lo] + nums[hi];
                    if (sum == nums[i]) {
                        res++;
                        while (lo < hi && nums[lo] == nums[lo + 1]) lo++;
                        while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
                        lo++;
                        hi--;
                    } else if (sum > nums[i]) {
                        hi--;
                    } else {
                        lo++;
                    }
                } 
            }
            return res;
        }
    }
编辑于 2022-06-30 13:21:08 回复(0)
Python3版本,ac 70%
class Solution:
    def count(self, list1, n):
        cnt1 = 0
        for i in range(len(list1)-1):
            for j in range(i+1, len(list1)):
                if list1[i]+list1[j] == n:
                    cnt1 += 1
        return cnt1

    def NumberOfTriplets(self, arr):
        if len(arr) <= 2:
            return 0
        elif len(arr) >= 3:
            arr.sort()
            cnt = 0
            for i in range(2, len(arr)):
                cnt += self.count(arr[:i], arr[i])
            return cnt


发表于 2022-04-22 22:47:38 回复(0)
importjava.util.*;
 
 
publicclassSolution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param arr int整型一维数组
     * @return int整型
     */
    publicintNumberOfTriplets (int[] arr) {
        // write code here
        HashSet<Integer> h = newHashSet<>();
        for(inti =0;i<arr.length;i++){
            h.add(arr[i]);
        }
        Arrays.sort(arr);
        intcount = 0;
        for(intj = 0;j<arr.length;j++){
            for(intk =j+1;k<arr.length;k++){
                if(arr[j]+arr[k]>arr[arr.length-1])
                    break;
                if(h.contains(arr[j]+arr[k]))
                    count++;
            }
        }
        returncount;
    }
}
发表于 2021-11-11 14:14:42 回复(0)
int NumberOfTriplets(vector<int>& arr){
    int num=0;
    if(arr.size()<3){
        return num;
    }else{
        for (int i=0; i<arr.size(); i++) {
            for (int j=i+1; j<arr.size(); j++) {
                for (int h=0; h<arr.size(); h++) {
                    if(arr[h]!=arr[i]&&arr[h]!=arr[j]){
                        if (arr[i]+arr[j]==arr[h]) {
                            num++;
                        }
                    }
                }
            }
        }
    }
    return num;
}

发表于 2021-10-04 16:23:16 回复(0)
import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param arr int整型一维数组 
     * @return int整型
     */
    public int NumberOfTriplets (int[] arr) {
        int len = arr.length;
        if (len < 3) {
            return 0;
        }

        Set<Integer> set = new HashSet<>();
        for (int num : arr) {
            set.add(num);
        }
        int ans = 0;
        for (int i = 0; i < len - 1; i++) {
            for (int j = i + 1; j < len; j++) {
                int sum = arr[i] + arr[j];
                if (sum != arr[i] && sum != arr[j] && set.contains(sum)) {
                    ans++;
                }
            }
        }
        return ans;
    }
}
发表于 2021-07-11 18:19:06 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr int整型一维数组 
     * @return int整型
     */
    public int NumberOfTriplets (int[] arr) {
        // write code here
        int res = 0;
        int len = arr.length;
        if(len < 3){
            return 0;
        }
        Arrays.sort(arr);
        /** 
        先对数组进行排序;
        倒序遍历数组,将数组的每个元素视为target;
        用双指针的方法,寻找数组中 a+b = target 的组合数量;
        a、b、target是不重复的三个数;
                如:对于已经排序好的数组  [-3,-2,-1,0,1,2,3]
                3+0=3  这种情况是不行的;
        */
        
        for(int i=len-1;i>=0;i--){
            int temp = check(arr,0,len-1,i,arr[i]);
            res += temp;
        }
        return res;
    }
    
    int check(int[] arr ,int left,int right,int i,int target){
        int ans = 0;
        while(left < right){
            if(left == i){
                left++;
                continue;
            }
            
            if(right == i){
                right--;
                continue;
            }
            int sum = arr[left] + arr[right];
            if(sum == target){
                ans++;
                left++;
                right--;
            }else if(sum < target){
                left++;
            }else{
                right--;
            }
        }
        return ans;
    }
}

编辑于 2021-07-07 09:38:54 回复(0)