Leetcode Day19 技巧类

2024-09-03 07:04
文章标签 leetcode 技巧 day19

本文主要是介绍Leetcode Day19 技巧类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

75 颜色分类

136 一个数字出现一次, 其他出现两次

class Solution:def singleNumber(self, nums: List[int]) -> int:return reduce(lambda x, y: x ^ y, nums)

这个解法基于以下异或运算的性质:

任何数与 0 异或得到的结果是其本身:a ^ 0 = a
任何数与其自身异或得到的结果是 0:a ^ a = 0
异或运算满足交换律和结合律:a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c

因此,当我们对列表中的所有数字进行异或操作时:

出现两次的数字会相互抵消(因为 a ^ a = 0)
只出现一次的数字会保留下来(因为 a ^ 0 = a)

最终,reduce 函数返回的结果就是只出现一次的那个数字。

reduce相当于1101s中的accumulate, 你也可以自己指定起始值,

137 一个数字出现一次, 其他三次

6 Z字形表达一个string

class Solution:def convert(self, s: str, numRows: int) -> str:if numRows == 1:return sres = [[] for _ in range(numRows)]pos = 0row = 0down = Truewhile pos < len(s):if down and row < numRows - 1:res[row].append(s[pos])pos += 1row += 1continueif down and row == numRows - 1:down = Falseres[row].append(s[pos])pos += 1row -= 1continueif not down and row > 0:res[row].append(s[pos])pos += 1row -= 1continueif not down and row == 0:res[row].append(s[pos])pos += 1row += 1down = Truecontinuereturn "".join([''.join(x) for x in res])

我就直接这样模拟了, 没什么技巧

134 加油站

class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:n = len(gas)spare = 0min_spare = float('inf')min_index = 0for i in range(n):spare += gas[i] - cost[i]if spare < min_spare:min_spare = sparemin_index = ireturn -1 if spare < 0 else (min_index + 1) % n

“亏空最严重的一个点必须放在最后一步走,等着前面剩余的救助”, 这一句话直接醍醐灌顶了.
但是还存在一个问题, 为什么最后的spare >= 0就代表能通过呢?

135 分发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。

class Solution:def candy(self, ratings: List[int]) -> int:dp1 = [1] * len(ratings)for i in range(1, len(ratings)):if ratings[i] > ratings[i-1]:dp1[i] = dp1[i - 1] + 1dp2 = [1] * len(ratings)for i in range(len(ratings) - 2, -1, -1):if ratings[i] > ratings[i + 1]:dp2[i] = dp2[i + 1] + 1ans = [1] * len(ratings)for i in range(len(ratings)):ans[i] = max(dp1[i], dp2[i])return sum(ans)

左边一次, 右边一次即可

191 二进制中1的个数

class Solution:def hammingWeight(self, n: int) -> int:res = 0while n:res += n & 1n >>= 1return res

可以优化, 利用n & (n-1)

n&(n−1)作用: 二进制数字 n 最右边的 1 变成 0 ,其余不变。

def hammingWeight(self, n: int) -> int:res = 0while n:res += 1n &= n - 1return res

这篇关于Leetcode Day19 技巧类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param