2563. 统计公平数对的数目

Posted lxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2563. 统计公平数对的数目相关的知识,希望对你有一定的参考价值。

题目链接:2563. 统计公平数对的数目

方法:排序 + 二分

解题思路

(1)先对数组进行排序,排序之后并不影响公平数对的数目;
(2)对于任意一个 \\(j\\),它的公平数对 \\((i, j)\\) 满足 \\(lower - nums[j] ≤ nums[i] ≤ upper - nums[j]\\),即在 \\([0, j]\\) 范围中找满足条件的 \\(i\\) 的个数,通过二分查找可以快速找到。

代码

class Solution 
public:
    long long countFairPairs(vector<int>& nums, int lower, int upper) 
        sort(nums.begin(), nums.end());
        int n = nums.size();
        long long ans = 0;
        for (int i = 0; i < n; i ++ ) 
            int l = lower_bound(nums.begin() + i + 1, nums.end(), lower - nums[i]) - nums.begin();
            int r = upper_bound(nums.begin() + i + 1, nums.end(), upper - nums[i]) - nums.begin();
            ans += r - l;
        
        return ans;
    
;

复杂度分析

时间复杂度:\\(O(nlogn)\\)
空间复杂度:\\(O(1)\\)

296好数对的数目

给你一个整数数组 nums 。

如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。

返回好数对的数目。

  

示例 1

输入:nums = [1,2,3,1,1,3]

输出:4

解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始

示例 2

输入:nums = [1,1,1,1]

输出:6

解释:数组中的每组数字都是好数对

示例 3

输入:nums = [1,2,3]

输出:0

  

提示:

1 <= nums.length <= 100

1 <= nums[i] <= 100

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/number-of-good-pairs

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.isNumber;

/**

 * 1512. 好数对的数目

 * 给你一个整数数组 nums 。

如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。

返回好数对的数目。

来源:力扣(LeetCode)

链接:力扣

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 * @author wen.lei@brgroup.com

 *

 * 2022-2-19

 */

public class NumberOfGoodPairs

    /*  示例 1:

     

    输入:nums = [1,2,3,1,1,3]

    输出:4

    解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始

    示例 2:

     

    输入:nums = [1,1,1,1]

    输出:6

    解释:数组中的每组数字都是好数对

    示例 3:

     

    输入:nums = [1,2,3]

    输出:0

      

     

    提示:

     

    1 <= nums.length <= 100

    1 <= nums[i] <= 100*/

    /**

     * 暴力破解(穷举)

     * @param nums

     * @return

     */

    public int numIdenticalPairs(int[] nums)

        int count=0;

        for(int i=0;i<nums.length;i++)

            for(int j=1;j<nums.length;j++)

                //i<j 不能少

                if(nums[i]==nums[j] && i < j)

                    count++;

                

            

        

        return count;

    

package test.leecode.isNumber;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.isNumber.NumberOfGoodPairs;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-21

 */

public class NumberOfGoodPairsTest

    @Test

    public void test()

        NumberOfGoodPairs pair  = new NumberOfGoodPairs();

        Assert.assertEquals(4,pair.numIdenticalPairs(new int[] 1,2,3,1,1,3));

        Assert.assertEquals(6,pair.numIdenticalPairs(new int[] 1,1,1,1));

        Assert.assertEquals(0,pair.numIdenticalPairs(new int[] 1,2,3));

        Assert.assertEquals(1,pair.numIdenticalPairs(new int[] 1,2,2));

    

以上是关于2563. 统计公平数对的数目的主要内容,如果未能解决你的问题,请参考以下文章

3614好数对的数目

296好数对的数目

算法零基础学习计数法

算法零基础学习计数法

算法零基础学习计数法

算法学习1512. 好数对的数目(java / c / c++ / python / go / rust)