【LeetCode:2766. 重新放置石块 + 哈希表】

|-----------|
| 🚀 算法题 🚀 |

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

|-----------|
| 🚀 算法题 🚀 |


🍔 目录

    • [🚩 题目链接](#🚩 题目链接)
    • [⛲ 题目描述](#⛲ 题目描述)
    • [🌟 求解思路&实现代码&运行结果](#🌟 求解思路&实现代码&运行结果)
      • [⚡ 哈希表](#⚡ 哈希表)
        • [🥦 求解思路](#🥦 求解思路)
        • [🥦 实现代码](#🥦 实现代码)
        • [🥦 运行结果](#🥦 运行结果)
    • [💬 共勉](#💬 共勉)

🚩 题目链接

⛲ 题目描述

给你一个下标从 0 开始的整数数组 nums ,表示一些石块的初始位置。再给你两个长度 相等 下标从 0 开始的整数数组 moveFrom 和 moveTo 。

在 moveFrom.length 次操作内,你可以改变石块的位置。在第 i 次操作中,你将位置在 moveFrom[i] 的所有石块移到位置 moveTo[i] 。

完成这些操作后,请你按升序返回所有 有 石块的位置。

注意:

如果一个位置至少有一个石块,我们称这个位置 有 石块。

一个位置可能会有多个石块。

示例 1:

输入:nums = [1,6,7,8], moveFrom = [1,7,2], moveTo = [2,9,5]

输出:[5,6,8,9]

解释:一开始,石块在位置 1,6,7,8 。

第 i = 0 步操作中,我们将位置 1 处的石块移到位置 2 处,位置 2,6,7,8 有石块。

第 i = 1 步操作中,我们将位置 7 处的石块移到位置 9 处,位置 2,6,8,9 有石块。

第 i = 2 步操作中,我们将位置 2 处的石块移到位置 5 处,位置 5,6,8,9 有石块。

最后,至少有一个石块的位置为 [5,6,8,9] 。

示例 2:

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

输出:[2]

解释:一开始,石块在位置 [1,1,3,3] 。

第 i = 0 步操作中,我们将位置 1 处的石块移到位置 2 处,有石块的位置为 [2,2,3,3] 。

第 i = 1 步操作中,我们将位置 3 处的石块移到位置 2 处,有石块的位置为 [2,2,2,2] 。

由于 2 是唯一有石块的位置,我们返回 [2] 。

提示:

1 <= nums.length <= 105

1 <= moveFrom.length <= 105

moveFrom.length == moveTo.length

1 <= nums[i], moveFrom[i], moveTo[i] <= 109

测试数据保证在进行第 i 步操作时,moveFrom[i] 处至少有一个石块。

🌟 求解思路&实现代码&运行结果


⚡ 哈希表

🥦 求解思路
  1. 该题目的求解思路比较简单,我们可以使用map来记录每一个位置出现的次数,也可以通过有序表treeset来记录元素,既可以去重,又可以保证有序,因为元素个数并不会影响最终的结果(就是题目中说的全部交换)。
  2. 遍历moveFrom和moveTo数组,先获得move的次数,加到to的次数上,最后移除move,注意,如果move和to位置想等,直接跳过即可。
  3. 最后list收集map中所有的key,并对其进行升序排序。
  4. 有了基本的思路,接下来我们就来通过代码来实现一下的解法。
🥦 实现代码
java 复制代码
class Solution {
    public List<Integer> relocateMarbles(int[] nums, int[] moveFrom, int[] moveTo) {
        List<Integer> ans = new ArrayList<>();
        int n = moveFrom.length;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int v : nums) {
            map.put(v, map.getOrDefault(0, v) + 1);
        }
        for (int i = 0; i < n; i++) {
            int move = moveFrom[i], to = moveTo[i];
            if (move == to)
                continue;
            int cnt = map.getOrDefault(0, move);
            map.put(to, map.getOrDefault(0, to) + cnt);
            map.remove(move);
        }
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            ans.add(entry.getKey());
        }
        Collections.sort(ans);
        return ans;
    }
}
🥦 运行结果

💬 共勉

|----------------------------------|
| 最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |

相关推荐
骆晨学长几秒前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
是小Y啦2 分钟前
leetcode 106.从中序与后续遍历序列构造二叉树
数据结构·算法·leetcode
AskHarries6 分钟前
利用反射实现动态代理
java·后端·reflect
@月落6 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
程序猿练习生7 分钟前
C++速通LeetCode中等第9题-合并区间
开发语言·c++·leetcode
liuyang-neu12 分钟前
力扣 42.接雨水
java·算法·leetcode
z千鑫15 分钟前
【人工智能】如何利用AI轻松将java,c++等代码转换为Python语言?程序员必读
java·c++·人工智能·gpt·agent·ai编程·ai工具
y_dd19 分钟前
【machine learning-12-多元线性回归】
算法·机器学习·线性回归
m0_6312704019 分钟前
标准c语言(一)
c语言·开发语言·算法
万河归海42820 分钟前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio