【LeetCode】每日一题 2023_11_10 咒语和药水的成功对数(练习二分)

2023-11-10 13:45

本文主要是介绍【LeetCode】每日一题 2023_11_10 咒语和药水的成功对数(练习二分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 刷题前唠嗑
  • 题目:咒语和药水的成功对数
    • 题目描述
    • 代码与解题思路
    • 偷看大佬题解
  • 结语

刷题前唠嗑


LeetCode? 启动!!!

可恶,今天的题目怎么也这么长

题目:咒语和药水的成功对数

题目链接:2300. 咒语和药水的成功对数

题目描述

代码与解题思路

看完题目,怎么感觉怪怪的,先抛掉脑子吧~

暴力,启动!

func successfulPairs(spells []int, potions []int, success int64) (ans []int) {for _, v := range spells {cnt := 0for _, v2 := range potions {sum := int64(v)*int64(v2)if sum >= success {cnt++}}ans = append(ans, cnt)}return ans
}


启动失败。。。

是了,中等题怎么可能会让我们随便一个暴力就能过去呢。。。

菜鸟决定去看看题解是怎么做的,没啥思路

偷看大佬题解

二…二分?

这咋二分?这,这,还有这种操作,学会了

func successfulPairs(spells []int, potions []int, success int64) (ans []int) {sort.Ints(potions)for _, v := range spells {left, right := 0, len(potions)-1for left < right { // 二分找出成功组合的最小下标mid := left+(right-left)/2sum := int64(v)*int64(potions[mid])if sum >= success {right = mid} else {left = mid+1}}cmp := int64(v)*int64(potions[left])if cmp >= success {ans = append(ans, len(potions)-right)} else { // 没有一个组合成功ans = append(ans, 0)}}return ans
}

这道题可以用排序+二分查找的来做,我的主要算法流程如下:

  1. 排序 potions 数组
  2. 遍历 spells 数组
  3. 通过二分查找,找出排序后的 potions 数组中能与 spellls 数组的数成组合的最小下标,举个例子:
    假设这时的 splles 中的元素是 3,sucess 是 9,potions 数组是 [1, 2, 3, 4, 5, 6],二分之后得出的 right 就是 3,因为 3*3 以及乘之后的数 >= sucess 的数,符合题目要求
  4. 然后用 len(potions)-right 就能得出能成功组合的数量了

这道题目使用二分降低时间复杂度的核心就是通过 logn 的算法,求出能够组合成功的数量,将 n 方的算法优化成了 nlogn 级别。

结语

今天早上睡了个懒觉,写的有点晚了,今天的每日一题就当是练习二分啦~

这篇关于【LeetCode】每日一题 2023_11_10 咒语和药水的成功对数(练习二分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/383013

相关文章

据阿谱尔APO Research调研显示,2023年全球髓内钉市场销售额约为4.7亿美元

根据阿谱尔 (APO Research)的统计及预测,2023年全球髓内钉市场销售额约为4.7亿美元,预计在2024-2030年预测期内将以超过3.82%的CAGR(年复合增长率)增长。 髓内钉市场是指涉及髓内钉制造、分销和销售的行业。髓内钉是一种用于整形外科手术的医疗器械,用于稳定长骨骨折,特别是股骨、胫骨和肱骨。髓内钉通常由不銹钢或钛等材料制成,并插入骨的髓管中,以在愈合过程中提供结构支

LeetCode--231 2的幂

题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false class Solution {public:bool isPowerOfTwo(int n) {if (n <= 0) return fals

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--220 存在重复元素 III

题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例 示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例

LeetCode--217 存在重复元素

题目 给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true class Solution {p

LeetCode--214 最短回文串

题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 示例 1:输入: "aacecaaa"输出: "aaacecaaa"示例 2:输入: "abcd"输出: "dcbabcd" 思路: 我们需要添加多少个字符与给定字符串的前缀子串回文的长度有关. 也就是说去掉其前缀的回文子串,我们只需要补充剩下的子串的逆序

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

LeetCode--204 计数质数

题目 统计所有小于非负整数 n 的质数的数量。 示例 示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 class Solution {public:int countPrimes(int n) {if (n <= 2) return 0;int cnt = 0;vector<bool> isPrime(n, true);

LeetCode--198 打家劫舍

题目 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 示例 示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 =

LeetCode--171 Excel表列序号

题目 给定一个Excel表格中的列名称,返回其相应的列序号。例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ... 示例 示例 1:输入: "A"输出: 1示例 2:输入: "AB"输出: 28示例 3:输入: "ZY"输出: 701 class Solution {public:int titleToNumber(strin