关于力扣第167场双周赛的第一二题赛后反思
对于第一题,我写的代码如下:
class Solution:def scoreBalance(self, s: str) -> bool:t = sum([(ord(i) - ord('a')+1) for i in s])n = 0 for i in s:if n == t - n:return True n += ord(i) - ord('a') +1if n == t-n:return True return False
思路是先计算总分,再累加n看是否存在某一个节点使
我反思自己的代码,觉得两次判断过于繁琐,因为题目规定了s的长度大于等于2,所以完全可以优化成一次判断。
代码如下:
class Solution:def scoreBalance(self, s: str) -> bool:t = sum([(ord(i) - ord('a')+1) for i in s])n = 0 for i in s:n += ord(i) - ord('a') +1if n == t - n:return True return False
但其实这是一种用码量换思维速度的方式,显然如果s的长度为0,那么第二种写法虽然更简洁,但是会wa。
然后学习灵神第一题的写法。
class Solution:def scoreBalance(self, s: str) -> bool:total = sum(ord(b) & 31 for b in s)left = 0for b in s: # 字母位置是正数,可以遍历到 s 末尾(末尾一定不满足要求)left += ord(b) & 31if left * 2 == total:return Truereturn False作者:灵茶山艾府
链接:https://leetcode.cn/problems/equal-score-substrings/solutions/3803681/liang-ci-bian-li-pythonjavacgo-by-endles-60gb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
仿佛ord(b)&31后就是ord(b) - ord("a),这是为啥。
因为26个字符对应了96 +(1-26),那么26对应了5个二进制位,这五位全部为1,用和操作就能把0-25提取出来,而因为96的前5个二进制位全部空余,所以能成功提取。
所以以后写ord(b) - ord('a')就写ord("b")&31了。
对于第二题
我写的代码如下:
class Solution:def longestSubarray(self, nums: List[int]) -> int:n = len(nums)dp =[0 for _ in range(n+1)]for i in range(n):if i >= 2 and nums[i] == nums[i - 1] +nums[i-2]:dp[i] = max(dp[i-1] +1,1)else:if i == 0:dp[i] = 1else:dp[i] = 2return max(dp)
我写了一个递推,递推式子如下:
然后学习灵神的代码。
灵神的直接向后搜索的办法暴力而大胆,斐波拉契数列以指数的形式增长,所以向后搜索不会超过,然后U是10**9,所以保守估计计算次数是log(10**9,2)*10**5也就是 2989735.2853986262,不会超时,代码如下:
class Solution {
public:int longestSubarray(vector<int>& nums) {int n = nums.size();int ans = 2;int start = 0;for (int i = 2;i <n ; i ++){if (nums[i] != nums[i-1] +nums[i-2]){ans = max(ans,i - start);start = i - 1;}}return max(ans,n - start);}
};
然后灵神第二种做法是基于直接连续必然优于截取部分连续的观察,因为截取部分连续并不会出现会产生更多连续特征的一种情况,所以维护最前面的start就好了,代码如下:
class Solution {
public:int longestSubarray(vector<int>& nums) {int n = nums.size();int ans = 2;int start = 0;for (int i = 2;i <n ; i ++){if (nums[i] != nums[i-1] +nums[i-2]){ans = max(ans,i - start);start = i - 1;}}return max(ans,n - start);}
};
天色已晚,剩下两题,以后再写吧。