[leetcode 周赛 157] 1217 玩筹码

1217 Play With Chips 玩筹码

题目描述

数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。

你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):

  • 将第 i 个筹码向左或者右移动 2 个单位,代价为 0
  • 将第 i 个筹码向左或者右移动 1 个单位,代价为 1

最开始的时候,同一位置上也可能放着两个或者更多的筹码。

返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。

  • 示例 1:

    输入:chips = [1,2,3]
    输出:1
    解释:第二个筹码移动到位置三的代价是 1,第一个筹码移动到位置三的代价是 0,总代价为 1。

  • 示例 2:

    输入:chips = [2,2,2,3,3]
    输出:2
    解释:第四和第五个筹码移动到位置二的代价都是 1,所以最小总代价为 2。

  • 提示:
    • 1 <= chips.length <= 100
    • 1 <= chips[i] <= 10^9

思路

  • 读题
    移动奇数次位置代价为1, 移动偶数次位置代价为0, 寻找一个位置, 距离其他位置的距离尽量都是偶数

思路一 遍历所有位置, 选取最小代价

使用HashMap<Integer, Integer>存储位置该位置上的元素个数
循环变量, 每个位置与其他位置的距离, 加上其他位置的元素个数, 从而计算出代价
选出最小代价输出

  • 最坏时间复杂度 O(n^2) n=100 (chips.length <= 100) 位置个数

思路二 取出奇数位置和偶数位置的元素个数最小

因为不需要将结果位置输出, 并且偶数次移动是没有代价的
所有同是奇数或同是偶数, 它们之间移动是没有代价的, 而对应的其他奇数或偶数的元素, 就是需要付出的代价
选出需要付出最小的代价, 即奇或偶数位置上元素个数最小的

思路三 可以不使用HashMap 直接暴力枚举

基本思路同思路一, 但不进行记录位置与位置上元素个数, 直接循环暴力枚举(因为数据量不大 chips.length <= 100)

代码实现

思路一

class Solution {
    public int minCostToMoveChips(int[] chips) {
        // maps 存储位置和该位置上元素个数
        Map<Integer, Integer> maps = new HashMap<>(chips.length);
        for (int i : chips) {
            if (!maps.containsKey(i)) {
                maps.put(i, 0);
            }
            maps.put(i, maps.get(i) + 1);
        }
        //System.out.println("maps:\t" + maps);

        // keys 存储所有位置信息
        Set<Integer> keys = maps.keySet();
        // cost 所有元素移动到当前位置的代价
        // step 其他位置到当前位置的距离(绝对值)
        // minCost 所有位置中的最小代价
        int cost, step, minCost = Integer.MAX_VALUE;
        for (Integer cur : keys) {
            cost = 0;
            step = 0;
            for (Integer next : keys) {
                if (!cur.equals(next)) {
                    // 将next位置上的筹码移动到cur位置上
                    step = Math.abs(next - cur);
                    // 距离为偶数 则代价为0 否则代价为1
                    cost += (step % 2 == 1 ? 1 : 0) * maps.get(next);
                    //System.out.println(String.format("%d(%d) --> %d, step:%d, cost:%d",
                    //        next, maps.get(next), cur, step, cost));
                }
            }
            // 比较当前代价和所存储的最小代价 选出全局最小代价
            minCost = minCost > cost ? cost : minCost;
        }

        return minCost;
    }
}

思路二

class Solution {
    public int minCostToMoveChips(int[] chips) {
        // cnt 存放奇数和偶数位置上元素个数
        int[] cnt = {0, 0};
        for (int i : chips) {
            // 通过i&1 为0则为偶数 为1则为奇数
            cnt[i&1]++;
        }
        return Math.min(cnt[0], cnt[1]);
    }
}

思路三

class Solution {
    public int minCostToMoveChips(int[] chips) {
        int res = Integer.MAX_VALUE;
        int n = chips.length;

        for (int i = 0; i < n; i++) {
            int cur = 0;
            for (int j = 0; j < n; j++) {
                // 距离为奇数则加一
                cur += Math.abs(chips[j] - chips[i]) % 2;
            }
            res = res > cur ? cur : res;
        }

        return res;
    }
}

参考资源

第 157 场周赛 全球排名
【算法实况】体验使用 iPadOS 打算法竞赛 - 力扣周赛 - LeetCode Weekly 157
力扣周赛录屏-leetcode-weekly-contest-157

原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11643589.html

时间: 2024-11-06 22:45:20

[leetcode 周赛 157] 1217 玩筹码的相关文章

[leetcode 周赛 157] 1218 最长定差子序列

1218 Longest Arithmetic Subsequence of Given Difference 最长定差子序列 问题描述 给你一个整数数组 arr 和一个整数 difference,请你找出 arr 中所有相邻元素之间的差等于给定 difference 的等差子序列,并返回其中最长的等差子序列的长度. 示例 1: 输入:arr = [1,2,3,4], difference = 1 输出:4 解释:最长的等差子序列是 [1,2,3,4]. 示例 2: 输入:arr = [1,3,

[leetcode 周赛 157] 1219 黄金矿工

1219 Path with Maximum Gold 黄金矿工 问题描述 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注.每个单元格中的整数就表示这一单元格中的黄金数量:如果该单元格是空的,那么就是 0. 为了使收益最大化,矿工需要按以下规则来开采黄金: 每当矿工进入一个单元,就会收集该单元格中的所有黄金. 矿工每次可以从当前位置向上下左右四个方向走. 每个单元格只能被开采(进入)一次. 不得开采(进入)黄金数目为 0 的单元

[leetcode 周赛 159] 1233 删除子文件夹

1233 Remove Sub-Folders from the Filesystem 删除子文件夹 问题描述 你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹. 我们这样定义「子文件夹」: 如果文件夹?folder[i]?位于另一个文件夹?folder[j]?下,那么?folder[i]?就是?folder[j]?的子文件夹. 文件夹的「路径」是由一个或多个按以下格式串联形成的字符串: /?后跟一个或者多个小写英

[leetcode 周赛 159] 1234 替换子串等到平衡字符串

1234 Replace the Substring for Balanced String 替换子串等到平衡字符串 问题描述 有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串. 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」. 给你一个这样的字符串 s,请通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」. 你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换. 请返回待替换子串的最小可能长度. 如

LeetCode1217 玩筹码(贪心)

题目: 数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中. 你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以): 将第 i 个筹码向左或者右移动 2 个单位,代价为 0.将第 i 个筹码向左或者右移动 1 个单位,代价为 1.最开始的时候,同一位置上也可能放着两个或者更多的筹码. 返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价. 示例 1: 输入:chips = [1,2,3]输出:1解释:第二个筹码移动到位置三的代价是 1,第一个筹码移动到位置三的

【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)

Contest 81 (2018年11月8日,周四,凌晨) 链接:https://leetcode.com/contest/weekly-contest-81 比赛情况记录:结果:3/4, ranking: 440/2797.这次题目似乎比较简单,因为我比赛的时候前三题全做出来了(1:12:39),然后第四题有思路,正在写,没写完,比赛完了写完提交也对了. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [821]

【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)

Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653-656) 链接:https://leetcode.com/contest/leetcode-weekly-contest-44 比赛情况记录:就做出来两题,第三题不难,然而就是在算坐标的时候卡住了.orz.结果:2/4,ranking:637/2272.第四题没看题,第三题搞得心情不好了orz. [653]Two Sum

【Leetcode周赛】从contest-71开始。(一般是10个contest写一篇文章)

Contest 71 () Contest 72 () Contest 73 (2019年1月30日模拟) 链接:https://leetcode.com/contest/weekly-contest-73 Contest 74 (2019年1月31日模拟) 链接:https://leetcode.com/contest/weekly-contest-74 Contest 75 (2019年1月31日模拟) 链接:https://leetcode.com/contest/weekly-conte

【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)

Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日补充的报告.当时不想写.rank:1093/3924,AC:2/4.还是太慢了. [984]String Without AAA or BBB(第一题 4分)(Greedy, M) 给了两个数字,A 代表 A 个 'A', B 代表 B 个'B' 在字符串里面.返回一个可行的字符串,字符串中包含 A