From 283672d2d5f70066600c5ad3c646c2ef018a28c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BD=A9=E8=BE=95=E9=BE=99=E5=84=BF?= Date: Sun, 26 Dec 2021 14:45:25 +0800 Subject: [PATCH] =?UTF-8?q?5965:=E7=9B=B8=E5=90=8C=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E7=9A=84=E9=97=B4=E9=9A=94=E4=B9=8B=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/IntervalsBetweenIdenticalElements.java | 90 +++++++++++++++++++ .../IntervalsBetweenIdenticalElements.md | 45 ++++++++++ 2 files changed, 135 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/IntervalsBetweenIdenticalElements.java create mode 100644 src/main/java/leetcode/editor/cn/doc/content/IntervalsBetweenIdenticalElements.md diff --git a/src/main/java/leetcode/editor/cn/IntervalsBetweenIdenticalElements.java b/src/main/java/leetcode/editor/cn/IntervalsBetweenIdenticalElements.java new file mode 100644 index 0000000..49b4d67 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/IntervalsBetweenIdenticalElements.java @@ -0,0 +1,90 @@ +//给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。 +// +// arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] 和 arr[j] 之间的间隔是 |i - j| 。 +// +// 返回一个长度为 n 的数组 intervals ,其中 intervals[i] 是 arr[i] 和 arr 中每个相同元素(与 arr[i] 的值相同 +//)的 间隔之和 。 +// +// 注意:|x| 是 x 的绝对值。 +// +// +// +// 示例 1: +// +// 输入:arr = [2,1,3,1,2,3,3] +//输出:[4,2,7,2,4,4,5] +//解释: +//- 下标 0 :另一个 2 在下标 4 ,|0 - 4| = 4 +//- 下标 1 :另一个 1 在下标 3 ,|1 - 3| = 2 +//- 下标 2 :另两个 3 在下标 5 和 6 ,|2 - 5| + |2 - 6| = 7 +//- 下标 3 :另一个 1 在下标 1 ,|3 - 1| = 2 +//- 下标 4 :另一个 2 在下标 0 ,|4 - 0| = 4 +//- 下标 5 :另两个 3 在下标 2 和 6 ,|5 - 2| + |5 - 6| = 4 +//- 下标 6 :另两个 3 在下标 2 和 5 ,|6 - 2| + |6 - 5| = 5 +// +// +// 示例 2: +// +// 输入:arr = [10,5,10,10] +//输出:[5,0,3,4] +//解释: +//- 下标 0 :另两个 10 在下标 2 和 3 ,|0 - 2| + |0 - 3| = 5 +//- 下标 1 :只有这一个 5 在数组中,所以到相同元素的间隔之和是 0 +//- 下标 2 :另两个 10 在下标 0 和 3 ,|2 - 0| + |2 - 3| = 3 +//- 下标 3 :另两个 10 在下标 0 和 2 ,|3 - 0| + |3 - 2| = 4 +// +// +// +// +// 提示: +// +// +// n == arr.length +// 1 <= n <= 10⁵ +// 1 <= arr[i] <= 10⁵ +// +// 👍 9 👎 0 + +package leetcode.editor.cn; + +import java.util.*; + +//5965:相同元素的间隔之和 +class IntervalsBetweenIdenticalElements { + public static void main(String[] args) { + //测试代码 + Solution solution = new IntervalsBetweenIdenticalElements().new Solution(); + } + + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public long[] getDistances(int[] arr) { + Map> map = new HashMap<>(); + for (int i = 0; i < arr.length; i++) { + List list = map.getOrDefault(arr[i], new ArrayList<>()); + list.add(i); + map.put(arr[i], list); + } + long[] arrs = new long[arr.length]; + for (int key : map.keySet()) { + List list = map.get(key); + if (list.size() == 1) { + arrs[list.get(0)] = 0; + } else { + long[] temp = new long[list.size() + 1]; + Collections.sort(list); + for (int i = 0; i < list.size(); i++) { + temp[i + 1] = temp[i] + list.get(i); + } + for (int i = 0; i < list.size(); i++) { + arrs[list.get(i)] = temp[temp.length - 1] - temp[i + 1] - temp[i] - ((long) temp.length - 2 * i - 2) * list.get(i); + } + } + } + return arrs; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/doc/content/IntervalsBetweenIdenticalElements.md b/src/main/java/leetcode/editor/cn/doc/content/IntervalsBetweenIdenticalElements.md new file mode 100644 index 0000000..697e673 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/doc/content/IntervalsBetweenIdenticalElements.md @@ -0,0 +1,45 @@ +

给你一个下标从 0 开始、由 n 个整数组成的数组 arr

+ +

arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i]arr[j] 之间的间隔是 |i - j|

+ +

返回一个长度为 n 的数组 intervals ,其中 intervals[i] arr[i] arr 中每个相同元素(与 arr[i] 的值相同)的 间隔之和

+ +

注意:|x|x 的绝对值。

+ +

 

+ +

示例 1:

+ +
输入:arr = [2,1,3,1,2,3,3]
+输出:[4,2,7,2,4,4,5]
+解释:
+- 下标 0 :另一个 2 在下标 4 ,|0 - 4| = 4
+- 下标 1 :另一个 1 在下标 3 ,|1 - 3| = 2
+- 下标 2 :另两个 3 在下标 5 和 6 ,|2 - 5| + |2 - 6| = 7
+- 下标 3 :另一个 1 在下标 1 ,|3 - 1| = 2
+- 下标 4 :另一个 2 在下标 0 ,|4 - 0| = 4
+- 下标 5 :另两个 3 在下标 2 和 6 ,|5 - 2| + |5 - 6| = 4
+- 下标 6 :另两个 3 在下标 2 和 5 ,|6 - 2| + |6 - 5| = 5
+
+ +

示例 2:

+ +
输入:arr = [10,5,10,10]
+输出:[5,0,3,4]
+解释:
+- 下标 0 :另两个 10 在下标 2 和 3 ,|0 - 2| + |0 - 3| = 5
+- 下标 1 :只有这一个 5 在数组中,所以到相同元素的间隔之和是 0
+- 下标 2 :另两个 10 在下标 0 和 3 ,|2 - 0| + |2 - 3| = 3
+- 下标 3 :另两个 10 在下标 0 和 2 ,|3 - 0| + |3 - 2| = 4
+
+ +

 

+ +

提示:

+ +
    +
  • n == arr.length
  • +
  • 1 <= n <= 105
  • +
  • 1 <= arr[i] <= 105
  • +
+
  • 👍 9
  • 👎 0
  • \ No newline at end of file