【每日一题Day120】LC2341数组能形成多少数对 | 哈希表 排序

数组能形成多少数对【LC2341】

给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤:

  • nums 选出 两个 相等的 整数
  • nums 中 移除这两个整数,形成一个 数对

请你在 nums 上多次执行此操作直到无法继续执行。

返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。

哈希表

  • 思路:使用哈希表记录某个数字在这之前是否存在,然后遍历每一个数字,如果存在那么可以从nums中移除这两个整数,形成一个 数对;如果不存在那么将哈希表赋值为true。那么剩下的数字为数组长度-2*数对数目

  • 实现

    class Solution {
        public int[] numberOfPairs(int[] nums) {
            int n = nums.length;
            boolean[] flag = new boolean[101];
            int[] res = new int[2];
            for (int num : nums){
                if (flag[num]){
                    res[0]++;
                    flag[num] = false;
                }else{
                    flag[num] = true;
                }
            }
            res[1] = n - 2 * res[0];
            return res;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n ) O(n) O(n),n为数组长度
      • 空间复杂度: O ( C ) O(C) O(C),C为字符集大小,本题中为101

排序

  • 思路:将数组排序,从数组第一个元素开始遍历,如果nums[i]==nums[i+1],那么可以形成一个数对,指针向后移动两个;否则后移一位

  • 实现

    class Solution {
        public int[] numberOfPairs(int[] nums) {
            int n = nums.length;
            int[] res = new int[2];
            Arrays.sort(nums);
            int i = 0;
            while (i < n - 1){
                if (nums[i] == nums[i + 1]){
                    res[0]++;
                    i += 2;
                }else{
                    i++;
                }
            }
            res[1] = n - 2 * res[0];
            return res;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),n为数组长度
      • 空间复杂度: O ( 1 ) O(1) O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值