打折购买糖果的最小开销
打折购买糖果的最小开销
一家商店正在打折销售糖果。每购买 两个 糖果,商店会 免费 送一个糖果。免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 。比方说,总共有 4 个糖果,价格分别为 1 ,2 ,3 和 4 ,一位顾客买了价格为 2 和 3 的糖果,那么他可以免费获得价格为 1 的糖果,但不能获得价格为 4 的糖果。给你一个下标从 0 开始的整数数组 cost ,其中 cost[i] 表示第 i 个糖果的价格,请你返回获得 所有 糖果的 最小 总开销。
输入:cost = [1,2,3]
输出:5
解释:我们购买价格为 2 和 3 的糖果,然后免费获得价格为 1 的糖果。总开销为 2 + 3 = 5 。这是开销最小的 唯一 方案。注意,我们不能购买价格为 1 和 3 的糖果,并免费获得价格为 2 的糖果。这是因为免费糖果的价格必须小于等于购买的 2 个糖果价格的较小值。
12345678910var minimumCost = function(cost) { cost.sort((a, b) => b - a); let spe ...
使每位学生都有座位的最少移动次数
使每位学生都有座位的最少移动次数
一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示。给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数组 students ,其中 students[j] 是第 j 位学生的位置。你可以执行以下操作任意次:增加或者减少第 i 位学生的位置,每次变化量为 1 (也就是将第 i 位学生从位置 x 移动到 x + 1 或者 x - 1)请你返回使所有学生都有座位坐的 最少移动次数 ,并确保没有两位学生的座位相同。请注意,初始时有可能有多个座位或者多位学生在 同一 位置。
输入:seats = [3,1,5], students = [2,7,4]
输出:4
解释:学生移动方式如下:
第一位学生从位置 2 移动到位置 1 ,移动 1 次。
第二位学生从位置 7 移动到位置 5 ,移动 2 次。
第三位学生从位置 4 移动到位置 3 ,移动 1 次。总共 1 + 2 + 1 = 4 次移动。
输入:seats = [4,1,5,9], students = [1,3,2, ...
找出 3 位偶数
找出 3 位偶数
给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。你需要找出 所有 满足下述条件且 互不相同 的整数:该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。该整数不含 前导零该整数是一个 偶数例如,给定的 digits 是 [1, 2, 3] ,整数 132 和 312 满足上面列出的全部条件。将找出的所有互不相同的整数按 递增顺序 排列,并以数组形式返回。
输入:digits = [2,1,3,0]
输出:[102,120,130,132,210,230,302,310,312,320]
解释:所有满足题目条件的整数都在输出数组中列出。注意,答案数组中不含有 奇数 或带 前导零 的整数。
123456789101112131415161718var findEvenNumbers = function(digits) { const res = []; const len = digits.length; for (let i = 0; i < len; i++) & ...
两个数组间的距离值
两个数组间的距离值
给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的 距离值 。「距离值」 定义为符合此距离要求的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]| <= d 。
输入:arr1 = [4,5,8], arr2 = [10,9,1,8], d = 2
输出:2
解释:对于 arr1[0]=4 我们有:|4-10|=6 > d=2|4-9|=5 > d=2|4-1|=3 > d=2|4-8|=4 > d=2所以 arr1[0]=4 符合距离要求
对于 arr1[1]=5 我们有:|5-10|=5 > d=2|5-9|=4 > d=2|5-1|=4 > d=2|5-8|=3 > d=2所以 arr1[1]=5 也符合距离要求
对于 arr1[2]=8 我们有:|8-10|=2 <= d=2|8-9|=1 <= d=2|8-1|=7 > d=2|8-8|=0 <= d=2存在距离小于等于 2 的 ...
将找到的值乘以 2
将找到的值乘以 2
给你一个整数数组 nums ,另给你一个整数 original ,这是需要在 nums 中搜索的第一个数字。接下来,你需要按下述步骤操作:如果在 nums 中找到 original ,将 original 乘以 2 ,得到新 original(即,令 original = 2 * original)。否则,停止这一过程。只要能在数组中找到新 original ,就对新 original 继续 重复 这一过程。返回 original 的 最终 值。
输入:nums = [5,3,6,1,12], original = 3
输出:24
解释:
3 能在 nums 中找到。3 * 2 = 6 。
6 能在 nums 中找到。6 * 2 = 12 。
12 能在 nums 中找到。12 * 2 = 24 。
24 不能在 nums 中找到。因此,返回 24 。
输入:nums = [2,7,9], original = 4
输出:4
解释:
4 不能在 nums 中找到。因此,返回 4 。
123456789101112131415var fin ...
最多可以参加的会议数目
按照频率将数组升序排序
给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议请你返回你可以参加的 最大 会议数目。
输入:events = [[1,2],[2,3],[3,4]]
输出:3
解释:你可以参加所有的三个会议。安排会议的一种方案如上图。第 1 天参加第一个会议。第 2 天参加第二个会议。第 3 天参加第三个会议。
输入:events= [[1,2],[2,3],[3,4],[1,2]]
输出:4
123456789101112131415161718var maxEvents = function(events) { let count = 0, had = []; events.sort((a, b) => a[1] - b[1]); for (let i = 0, len ...
按照频率将数组升序排序
按照频率将数组升序排序
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。请你返回排序后的数组。
输入:nums = [1,1,2,2,2,3]
输出:[3,1,1,2,2,2]
解释:’3’ 频率为 1,’1’ 频率为 2,’2’ 频率为 3 。
输入:nums = [2,3,1,3,2]
输出:[1,3,3,2,2]
解释:’2’ 和 ‘3’ 频率都为 2 ,所以它们之间按照数值本身降序排序。
123456789101112131415161718var frequencySort = function(nums) { // 统计频次 let cnt = new Array(210).fill(0); for (let num of nums) { cnt[num + 100] += 1; } // 比较器排序 nums.sort((n1, n2) => { if (cnt[n ...
除数博弈
除数博弈
爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 n 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < n 且 n % x == 0 。用 n - x 替换黑板上的数字 n 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 true 。假设两个玩家都以最佳状态参与游戏。
输入:n = 2
输出:true
解释:爱丽丝选择 1,鲍勃无法进行操作。
输入:n = 3
输出:false
解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。
12345678910111213141516171819202122var divisorGame = function(N) { if(N == 1) { return false; } if(N == 2) { return true; } const dp = new Array(N+1); dp[1 ...
划分数组为连续数字的集合
划分数组为连续数字的集合
给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个连续数字组成的集合。如果可以,请返回 true;否则,返回 false。
输入:nums = [1,2,3,3,4,4,5,6], k = 4
输出:true
解释:数组可以分成 [1,2,3,4] 和 [3,4,5,6]。
输入:nums = [3,2,1,2,3,4,3,4,5,9,10,11], k = 3
输出:true
解释:数组可以分成 [1,2,3] , [2,3,4] , [3,4,5] 和 [9,10,11]。
输入:nums = [3,3,2,2,1,1], k = 3
输出:true
12345678910111213141516171819var isPossibleDivide = function(nums, k) { let len = nums.length if (len % k !== 0) return false nums = nums.sort((a, b) => a - ...
数组大小减半
数组大小减半
给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。返回 至少 能删除数组中的一半整数的整数集合的最小大小。
输入:arr = [3,3,3,3,5,5,5,2,2,7]
输出:2
解释:选择 {3,7} 使得结果数组为 [5,5,5,2,2]、长度为 5(原数组长度的一半)。大小为 2 的可行集合有 {3,5},{3,2},{5,2}。选择 {2,7} 是不可行的,它的结果数组为 [3,3,3,3,5,5,5],新数组长度大于原数组的二分之一。
输入:arr = [7,7,7,7,7,7]
输出:1
解释:我们只能选择集合 {7},结果数组为空。
1234567891011121314151617181920var minSetSize = function(arr) { // 首先需要算出每个数字在数组中出现的次数, // 将数组的长度按照100的比例进行划分 let dataLength = arr.length; let count = {}; arr ...