当前位置: 首页 > news >正文

关于力扣第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看是否存在某一个节点使

n = \frac{s}{2}

我反思自己的代码,觉得两次判断过于繁琐,因为题目规定了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)

我写了一个递推,递推式子如下:dp(i) = \begin{cases} 1 & \text{if } x = 0 \\ 2 & \text{if } x = 1\\ max(dp(i-1) +1,2) &\text{if } x >= 2 \&\& nums_{i} = nums_{i-1} +niums_{i-2} \end{cases}

然后学习灵神的代码。

灵神的直接向后搜索的办法暴力而大胆,斐波拉契数列以指数的形式增长,所以向后搜索不会超过logU,然后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);}
};

天色已晚,剩下两题,以后再写吧。

http://www.dtcms.com/a/477713.html

相关文章:

  • Post-training of LLMs
  • 【学习总结】AI接口测试-零基础从接口概念到客达天下系统Apifox+DeepSeek接口测试实战全流程
  • 【苍穹外卖笔记】Day04--套餐管理模块
  • 初识redis(分布式系统, redis的特性, 基本命令)
  • [特殊字符] Avalonia + Silk.NET 加载 3D 模型时 GenBuffer 返回 0?这是个底层兼容性陷阱!
  • 学习threejs,打造交互式花卉生成器
  • Redis 学习笔记(二)
  • 北京展览馆网站建设wordpress插件排列
  • 北京做网站优化多少钱最基本最重要的网站推广工具是
  • 每日算法刷题Day70:10.13:leetcode 二叉树10道题,用时2h
  • MySQL 设置远程 IP 连接方式(含自动检测授权脚本)
  • flash型网站网址高校思政课网站建设
  • 网站建设费做什么会计科目硬件开发外包平台
  • 【SpringBoot从初学者到专家的成长15】MVC、Spring MVC与Spring Boot:理解其差异与联系
  • Docker 存储与数据共享
  • k8s storageclasses nfs-provisioner 部署
  • Linux(Samba服务)
  • 电商智能客服进化论:多轮对话+意图识别+知识推荐系统开发
  • 算法198. 打家劫舍
  • 刚学做网站怎么划算全栈网站开发工程师
  • 长春网站优化公司wordpress目录遍历漏洞
  • 华为OD-23届考研-Java面经
  • 10.9 鸿蒙创建和运行项目
  • delphi调用C#编写的DLL
  • 从API调用到智能体编排:GPT-5时代的AI开发新模式
  • C++学习录(1):C++入门简介,从零开始
  • 电力专用多功能微气象监测装置在电网安全运维中的核心价值是什么?
  • 科研快报 |声波“听”见火灾温度:混合深度学习重构三维温度场
  • 从超级大脑到智能毛细血管:四大技术重构智慧园区生态版图
  • 旅游网站建设方案书制作一个网站平台需要多少钱