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

网站运营的发展方向微商城设计网站建设

网站运营的发展方向,微商城设计网站建设,网站问题seo解决方案,国内app开发公司排名汇总白银挑战-贪心高频问题 1. 区间问题 所有的区间问题,参考下面这张图 1.1 判断区间是否重叠 LeetCode252 https://leetcode.cn/problems/meeting-rooms/ 思路分析 因为一个人在同一时刻只能参加一个会议,因此题目的本质是判断是否存在重叠区间 将区…

白银挑战-贪心高频问题

1. 区间问题

所有的区间问题,参考下面这张图

在这里插入图片描述

1.1 判断区间是否重叠

LeetCode252
https://leetcode.cn/problems/meeting-rooms/

思路分析

因为一个人在同一时刻只能参加一个会议,因此题目的本质是判断是否存在重叠区间

  1. 将区间按照会议开始时间进行排序
  2. 然后遍历一遍判断后面的会议开始的时候是否前面的还没有结束
  3. 如果出现重叠,返回false

代码实现

class Solution:def canAttendMeetings(self, intervals: List[List[int]]) -> bool:intervals.sort(key=lambda x: x[0])for i in range(1, len(intervals)):if intervals[i][0] < intervals[i - 1][1]:return Falsereturn True
class Solution:def canAttendMeetings(self, intervals: List[List[int]]) -> bool:intervals.sort(key=lambda x: x[0])return all(intervals[i][0] >= intervals[i - 1][1] for i in range(1, len(intervals)))

1.2 合并区间

LeetCode 56
https://leetcode.cn/problems/merge-intervals/

思路分析

  1. 首先对区间按照起始端点进行升序排序
  2. 然后逐个判断当前区间是否与前一个区间重叠
    如果不重叠,直接加入结果集
    如果重叠,将当前区间与前一个区间进行合并

区间合并
区间1,区间2 合并

[ 区间1起始时间,max(区间1结束时间,区间2结束时间) ]

代码实现

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort(key=lambda x: x[0])merged = []for interval in intervals:# 合并列表为空if not merged:merged.append(interval)# 当前区间与上一区间不重叠elif interval[0] > merged[-1][1]:merged.append(interval)# 当前区间与上一区间重叠,需要合并else:# 区间合并操作merged[-1][1] = max(merged[-1][1], interval[1])return merged

1.3 插入区间

LeetCode57
https://leetcode.cn/problems/insert-interval/

思路分析

区间已经按照起始端点升序排序,我们直接遍历区间列表,寻找新区间的插入位置即可

  1. 将新区间左边且相离的区间加入结果集
  2. 接着判断当前区间是否与新区间重叠
    重叠,进行合并,直到遍历到当前区间在新区间右边且相离,加入合并后区间
    不重叠,直接加入新区间
  3. 将新区间右边且相离的区间加入结果集

代码实现

class Solution:def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:inserted = []index = 0n = len(intervals)# 将新区间左边且相离的区间加入结果集while index < n and intervals[index][1] < newInterval[0]:inserted.append(intervals[index])index += 1# 接着判断当前区间是否与新区间重叠# 重叠,进行合并,直到遍历到当前区间在新区间右边且相离,加入合并后区间# 不重叠,直接加入新区间while index < n and intervals[index][0] <= newInterval[1]:newInterval[0] = min(newInterval[0], intervals[index][0])newInterval[1] = max(newInterval[1], intervals[index][1])index += 1inserted.append(newInterval)# 将新区间右边且相离的区间加入结果集while index < n:inserted.append(intervals[index])index += 1return inserted
class Solution:def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:inserted = []index = 0n = len(intervals)while index < n:if intervals[index][1] < newInterval[0]:inserted.append(intervals[index])index += 1elif intervals[index][0] <= newInterval[1]:newInterval[0] = min(newInterval[0], intervals[index][0])newInterval[1] = max(newInterval[1], intervals[index][1])index += 1else:breakinserted.append(newInterval)inserted.extend(intervals[index:])return inserted

2. 字符串分割

LeetCode763
https://leetcode.cn/problems/partition-labels/

思路分析

需要把同一个字母圈在同一个区间里

该遍历过程相当于要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。

具体做法

  1. 统计每一个字符最后出现的位置
  2. 从头遍历字符,并更新字符最远出现下标,如果找到字符最远出现位置下标和当前下标相等,则找到了分割点

在这里插入图片描述

代码实现

class Solution:def partitionLabels(self, s: str) -> List[int]:ans = []# 第一轮遍历,统计每一个字符最后出现的位置char_dict = {}for i in range(len(s)):char_dict[s[i]] = i# 第二轮遍历begin_index = -1char_far_index = 0for i in range(len(s)):char_far_index = max(char_far_index, char_dict[s[i]])if char_far_index == i:ans.append(i - begin_index)begin_index = ireturn ans
class Solution:def partitionLabels(self, s: str) -> List[int]:last = [0] * 26for i, char in enumerate(s):last[ord(char) - ord('a')] = ipartition = list()start, end = 0, 0for i, char in enumerate(s):end = max(end, last[ord(char) - ord('a')])if i == end:partition.append(end - start + 1)start = end + 1return partition

3. 加油站问题

LeetCode134
https://leetcode.cn/problems/gas-station/

思路分析

很容易想到暴力解法,从第一站开始尝试。缺点就是需要大量的重复计算

在这里插入图片描述

优化:
总油量 - 总消耗 ≥ 0,可以跑完一圈,具体到每一段就是各个加油站的剩油量 rest[i] 相加一定是大于等于0的

  • 每个加油站剩油量 rest[i] = gas[i] - cost[i]
  • i从0开始累加 rest[i] ,得到当前油量 curSum
  • 一旦curSum小于0,说明[0, i]区间都不能作为起始位置,起始位置必须从i+1开始重新算,只有这样才能保证有可能完成

复杂度降低:从O(n^2)降低到O(n)

在这里插入图片描述

代码实现


class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:total_sum = 0cur_sum = 0start = 0for i in range(len(gas)):cur_sum += gas[i] - cost[i]total_sum += gas[i] - cost[i]# 当前累加rest[i]和 cur_sum小于0if cur_sum < 0:# 更新起始位置为 i+1start = i+1# cur_sum从 0 开始cur_sum = 0return -1 if total_sum < 0 else start
http://www.yayakq.cn/news/544860/

相关文章:

  • wordpress临时关站酒泉做网站
  • 做高端企业网站建设公司网站建设需要条件
  • 企业建站程序有哪些wordpress 360字体
  • 网站建设中 html模板网页设计教程电影
  • 网站建设定制网站建设公司哪家好seo优化教程视频
  • 色一把做最好的看片网站西安建筑网站
  • 网站建设项目策划书广州定制网站建设
  • 机械行业营销型网站centos nginx wordpress
  • 杭州建设局网站官网win 2012网站建设
  • 怎么做淘宝网站步骤网站怎么做联系我们页面
  • 网站内页设计中国城乡建设部网站
  • 有做兼职赚钱的网站吗做网站 用什么做数据库最好
  • 租网站服务器价格纯静态网站怎么做cdn
  • 如何用ps做网站界面圣都装饰
  • 网站建设与运维做网站平台公司有哪些
  • 网站建设添加展示栏作一个网站要多少钱
  • 全球网站排行纯静态网站 维护
  • 做视频网站了几百万wordpress .po 在哪里
  • 常州自助做网站手机网站建设策划方案
  • 徐州市水利工程建设有限公司网站校园网络安全设计方案
  • asp开发网站详细步骤怎么做微信钓鱼网站吗
  • 旅游目的地网站建设微信小程序推广平台
  • 网站怎么可以做视频播放wordpress 主页链接
  • 广元市规划和建设局网站WordPress mip
  • 怀柔手机网站建设招商网址
  • 苏州市网站建设服务山东企业网站建设哪家好
  • 制作营销网站模板网页设计构建的基本流程
  • 找人做网站 自己购买服务器南京专业网站建设
  • 番禺品牌型网站东莞网站平台价格
  • 绍兴高端网站开发网站建设与网站优化