2670.找出不同元素数目差数组-力扣(LeetCode)

2670.找出不同元素数目差数组-力扣(LeetCode)_第1张图片

一小池勺

“音乐会治愈我,运动会治愈我,风景会治愈我,阅读会治愈我,做饭也会治愈我,还有阴雨天的被窝,周末可以肆无忌惮的赖床,我的意思是,我们应该热爱生活。”


WeChat

2670.找出不同元素数目差数组-力扣(LeetCode)_第2张图片


文章目录

    • 前言
    • 题目详情
    • 示例
    • 提示
    • 题解
    • 代码思路

前言

感谢《LeetCode》平台

2670.找出不同元素数目差数组-力扣(LeetCode)_第3张图片

题目详情

给你一个下标从 0 开始的数组 nums ,数组长度为 nnums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示,其中 diff[i] 等于前缀 nums[0, ..., i] 中不同元素的数目 减去 后缀 nums[i + 1, ..., n - 1] 中不同元素的数目。返回 nums 的 不同元素数目差 数组。注意 nums[i, ..., j] 表示 nums 的一个从下标 i 开始到下标 j 结束的子数组(包含下标 ij 对应元素)。特别需要说明的是,如果 i > j ,则 nums[i, ..., j] 表示一个空子数组。

示例

  • 示例 1:

输入:

nums = [1,2,3,4,5]

输出:

[-3,-1,1,3,5]

解释:

对于 i = 0,前缀中有 1 个不同的元素,而在后缀中有 4 个不同的元素。因此,diff[0] = 1 - 4 = -3 。
对于 i = 1,前缀中有 2 个不同的元素,而在后缀中有 3 个不同的元素。因此,diff[1] = 2 - 3 = -1 。
对于 i = 2,前缀中有 3 个不同的元素,而在后缀中有 2 个不同的元素。因此,diff[2] = 3 - 2 = 1 。
对于 i = 3,前缀中有 4 个不同的元素,而在后缀中有 1 个不同的元素。因此,diff[3] = 4 - 1 = 3 。
对于 i = 4,前缀中有 5 个不同的元素,而在后缀中有 0 个不同的元素。因此,diff[4] = 5 - 0 = 5 。

  • 示例 2:

输入:

nums = [3,2,3,4,2]

输出:

[-2,-1,0,2,3]

解释:

对于 i = 0,前缀中有 1 个不同的元素,而在后缀中有 3 个不同的元素。因此,diff[0] = 1 - 3 = -2 。
对于 i = 1,前缀中有 2 个不同的元素,而在后缀中有 3 个不同的元素。因此,diff[1] = 2 - 3 = -1 。
对于 i = 2,前缀中有 2 个不同的元素,而在后缀中有 2 个不同的元素。因此,diff[2] = 2 - 2 = 0 。
对于 i = 3,前缀中有 3 个不同的元素,而在后缀中有 1 个不同的元素。因此,diff[3] = 3 - 1 = 2 。
对于 i = 4,前缀中有 3 个不同的元素,而在后缀中有 0 个不同的元素。因此,diff[4] = 3 - 0 = 3 。

提示

1 <= n == nums.length <= 50
1 <= nums[i] <= 50

题解

/**
 @ 一小池勺
 * @param {number[]} nums
 * @return {number[]}
 @ 2024 1 31
 */
var distinctDifferenceArray = function(nums) {  
  const res = []  
  let left = new Set()  // 选用 Set
  const right = nums.slice(0)  // 复制数组
  // 一次遍历
  for(let i = 0; i < nums.length; i++) {  
    left.add(right.splice(0, 1)[0])  // 遍历过程中,每一轮都将 right 的第一个元素给到 left
    res.push(left.size - (new Set(right)).size)  // 计算
  }  
  return res  
}

代码思路

  • Set结构会进行数组去重
  • 一次遍历,不断右移,更新 diff[i]
  • splice可以影响 right 数组
  • (new Set(right)).size 去重后的长度

你可能感兴趣的:(leetcode,算法,数据结构)