zoukankan      html  css  js  c++  java
  • LeetCode 923. 3Sum With Multiplicity

    原题链接在这里:https://leetcode.com/problems/3sum-with-multiplicity/

    题目:

    Given an integer array A, and an integer target, return the number of tuples i, j, k  such that i < j < k and A[i] + A[j] + A[k] == target.

    As the answer can be very large, return it modulo 10^9 + 7.

    Example 1:

    Input: A = [1,1,2,2,3,3,4,4,5,5], target = 8
    Output: 20
    Explanation: 
    Enumerating by the values (A[i], A[j], A[k]):
    (1, 2, 5) occurs 8 times;
    (1, 3, 4) occurs 8 times;
    (2, 2, 4) occurs 2 times;
    (2, 3, 3) occurs 2 times.
    

    Example 2:

    Input: A = [1,1,2,2,2,2], target = 5
    Output: 12
    Explanation: 
    A[i] = 1, A[j] = A[k] = 2 occurs 12 times:
    We choose one 1 from [1,1] in 2 ways,
    and two 2s from [2,2,2,2] in 6 ways.

    Note:

    1. 3 <= A.length <= 3000
    2. 0 <= A[i] <= 100
    3. 0 <= target <= 300

    题解:

    Perform 3Sum and find the target.

    Here there are 2 cases:

    1. A[l] != A[r], count the frequency of A[l] and A[r], possible number of tuples is leftCount*rightCount.

    e.g. 2333, A[l] = 2, A[r] = 3, leftCount = 1, rightCount = 3, number of types is 1*3 = 3.

    2. A[l] == A[r], number of tupes is count*(count-1)/2.

    e.g. 222, A[l] = 2, A[r] = 2, number of tupes 3*2/2 = 3. There are 3 ways to pick 2 elements from it.

    Time Compelxity: O(n^2). n = A.length.

    Space: O(1).

    AC Java:

     1 class Solution {
     2     public int threeSumMulti(int[] A, int target) {
     3         if(A == null || A.length == 0){
     4             return 0;
     5         }
     6         
     7         int res = 0;
     8         int M = 1000000000+7;
     9         Arrays.sort(A);
    10         for(int i = 0; i<A.length-2; i++){
    11             int l = i+1;
    12             int r = A.length-1;
    13             while(l<r){
    14                 int sum = A[i] + A[l] + A[r];
    15                 if(sum < target){
    16                     l++;
    17                 }else if(sum > target){
    18                     r--;
    19                 }else if(A[l] != A[r]){
    20                     int leftCount = 1;
    21                     int rightCount = 1;
    22                     while(l+1<r && A[l]==A[l+1]){
    23                         leftCount++;
    24                         l++;
    25                     }
    26                     
    27                     while(l+1<r && A[r]==A[r-1]){
    28                         rightCount++;
    29                         r--;
    30                     }
    31                     
    32                     res += leftCount*rightCount;
    33                     res = res%M;
    34                     l++;
    35                     r--;
    36                 }else{
    37                     // A[l] == A[r]
    38                     res += (r-l+1)*(r-l)/2;
    39                     res = res%M;
    40                     break;
    41                 }
    42             }
    43         }
    44         
    45         return res;
    46     }
    47 }
  • 相关阅读:
    shell中逻辑与的两种表示方法
    Git学习之Git恢复进度
    RH318之域控服务器
    《征服C指针》读书笔记
    2013年:一个技术领导的启程
    sqlite的一个Unable to Open database file的坑爹错误
    我的2013——青春的躁动
    C/C++注册动态对象到Lu系统并进行运算符重载
    Geeks面试题:Min Cost Path
    Leetcode Gray Code
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/11376454.html
Copyright © 2011-2022 走看看