2341. 数组能形成多少数对

125 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

题目 leetcode.cn/

  • 给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤:
    • 从 nums 选出 两个 相等的 整数
    • 从 nums 中移除这两个整数,形成一个 数对
  • 请你在 nums 上多次执行此操作直到无法继续执行。
  • 返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。

示例

  • 示例 1:

    • 输入: nums = [1,3,2,1,3,2,2]
    • 输出: [3,1]
    • 解释:
      • nums[0] 和 nums[3] 形成一个数对,并从 nums 中移除,nums = [3,2,3,2,2] 。
      • nums[0] 和 nums[2] 形成一个数对,并从 nums 中移除,nums = [2,2,2] 。
      • nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [2] 。
      • 无法形成更多数对。总共形成 3 个数对,nums 中剩下 1 个数字。
  • 示例 2:

    • 输入: nums = [1,1]
    • 输出: [1,0]
    • 解释: nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [] 。无法形成更多数对。总共形成 1 个数对,nums 中剩下 0 个数字。
  • 示例 3:

    • 输入: nums = [0]
    • 输出: [0,1]
    • 解释: 无法形成数对,nums 中剩下 1 个数字。

提示

  • 1<=nums.length<=1001 <= nums.length <= 100
  • 0<=nums[i]<=1000 <= nums[i] <= 100

代码

function numberOfPairs(nums: number[]): number[] {
    nums.sort((a, b) => { return a- b; });
    let sum = 0;
    for(let i = 0; i < nums.length - 1; i++){
        if(nums[i] === nums[i+1]){
            sum++;
            i++;
        }
    }
    return [sum, nums.length - (sum * 2)];
};
  • 排序 + 遍历统计:

    • 数对是相同数字成对出现的,所以可以先使用sort方法将数组排序,排序后的数组内每个相同的数字都会紧紧相邻在一起
    • 然后遍历排序后的数组,依次判断前一项和后一项,如果相等,那么是一个数对,统计变量+1,同时遍历参数也需要+1
    • 最后返回的结果,数对的个数就是统计到的次数,剩余的个数就是数组总长度减去数对包含元素的个数(一个数对包含两个元素,所以要* 2)
    • 这样就不用删除原数组的元素也能得到剩余的个数
function numberOfPairs(nums: number[]): number[] {
    let sum = 0;
    for(let i = 0; i < nums.length - 1; i++){
        for(let k = i+1; k < nums.length; k++){
            if(nums[i] === nums[k]){
                nums.splice(k, 1);
                sum++;
                break;
            }
        }
    }
    return [sum, nums.length - sum];
};
  • 双重遍历 + 判断:

    • 这里就不用先对原数组进行排序了,而是直接进行双重遍历操作,外层遍历依次取出数组内元素,内层遍历从外层元素后一个开始取出
    • 如果两个元素相等,那么这里使用splice方法删除内层遍历的相等的那个元素(这里只删除后面的相同的那个,不用两个都删除,如果都删除的话,遍历的下标不好维护),统计数对的变量+1,同时退出当前内循环。
    • 最后返回的结果,数对的个数就是统计到的次数,剩余的个数就是删除元素后的数组长度(splice改变原数组 长度)减去数对的个数(之前遍历的时候已经删除一个了,所以这里不用 * 2 了

结果

  • 排序 + 遍历统计:

image.png

  • 双重遍历 + 判断:

image.png