【leetcode78-81贪心算法、技巧96-100】

贪心算法【78-81】

121.买卖股票的最佳时机

在这里插入图片描述

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp=[[0,0] for _ in range(len(prices))]  #dp[i][0]第i天持有股票,dp[i][1]第i天不持有股票
        dp[0][0] = -prices[0]
        for i in range(1, len(prices)):
            dp[i][0] = max(dp[i-1][0], -prices[i])
            dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i])
        return dp[-1][1]

55.跳跃游戏

在这里插入图片描述

## for循环
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        cover = 0
        if len(nums) == 1: return True
        for i in range(len(nums)):
            if i <= cover:
                cover = max(i + nums[i], cover)
                if cover >= len(nums) - 1: return True
        return False

45.跳跃游戏

在这里插入图片描述

class Solution:
    def jump(self, nums) -> int:
        if len(nums)==1:  # 如果数组只有一个元素,不需要跳跃,步数为0
            return 0
        
        i = 0  # 当前位置
        count = 0  # 步数计数器
        cover = 0  # 当前能够覆盖的最远距离
        
        while i <= cover:  # 当前位置小于等于当前能够覆盖的最远距离时循环
            for i in range(i, cover+1):  # 遍历从当前位置到当前能够覆盖的最远距离之间的所有位置
                cover = max(nums[i]+i, cover)  # 更新当前能够覆盖的最远距离
                if cover >= len(nums)-1:  # 如果当前能够覆盖的最远距离达到或超过数组的最后一个位置,直接返回步数+1
                    return count+1
            count += 1  # 每一轮遍历结束后,步数+1

        
'''动态规划
1. dp[i]: 到nums[i]的最小跳跃次数
2. j<= nums[i]; dp[i+j] = min(dp[i+j], dp[i]+1)
3.dp[0] = 0,其他初始化为最大值
'''
class Solution:
    def jump(self, nums: List[int]) -> int:
        dp = [float('inf')] * len(nums)
        dp[0] = 0

        for i in range(len(nums)):
            for j in range(nums[i]+1):
                if i+j < len(nums):
                    dp[i+j] = min(dp[i+j], dp[i]+1)
        return dp[-1]

763.划分字母区间

在这里插入图片描述

在这里插入图片描述
题目要求:划分尽可能多的片段,每个字母最多出现在一个片段里面

可以分为如下两步:

  1. 统计每一个字符最后出现的位置
  2. 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        last_occurrence = {}  # 存储每个字符最后出现的位置
        for index, ch in enumerate(s):
            last_occurrence[ch] = i

        result = []
        start = 0
        end = 0
        for index, ch in enumerate(s):
            end = max(end, last_occurrence[ch])  # 找到当前字符出现的最远位置
            if index == end:  # 如果当前位置是最远位置,表示可以分割出一个区间
                result.append(end - start + 1)
                start = index + 1

        return result
         

技巧【96-100】

136.只出现一次的数字

在这里插入图片描述

空间常数,位运算
在这里插入图片描述

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        x = 0
        for num in nums:  # 1. 遍历 nums 执行异或运算
            x ^= num      
        return x         # 2. 返回出现一次的数字 x

169.多数元素

在这里插入图片描述

'''
======当发生 票数和 =0 时,剩余数组的众数一定不变 =====
如果vote为0,当前元素为临时众数
如果临时众数是全局众数,抵消的数字里面,一半是众数;没抵消的数组里面,众数肯定不变
如果临时众数不是全局众数,vito会变成0
'''
class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        vote = 0
        for i in nums:
            if vote == 0:
                x = i   #众数是i

            if i == x:
                vote += 1
            else : 
                vote -= 1
        return x

75.颜色分类

在这里插入图片描述

在这里插入图片描述 三路快排:nums[0…zero] = 0 ;nums[zero+1…i-1] = 1 ;nums[two…n-1] = 2
在这里插入图片描述 在这里插入图片描述
'''
nums[0…zero] = 0 ;
nums[zero+1…i-1] = 1 ;
nums[two…n-1] = 2
'''
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i, zero, two = 0,-1, len(nums)
        while i < two:
            if nums[i] == 1:
                i += 1
            elif nums[i] == 2:
                two -= 1
                nums[i], nums[two] = nums[two], nums[i]
            else:
                zero += 1
                nums[i], nums[zero] = nums[zero], nums[i]  #nums[zero]=1
                i += 1

31.下一个排列

在这里插入图片描述

在这里插入图片描述

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        length = len(nums)
        for i in range(length-2,-1,-1):
            if nums[i] >= nums[i+1]:
                continue  #剪枝

            for j in range(length-1,i,-1):
                if nums[j] > nums[i]:
                    nums[j], nums[i] = nums[i], nums[j]
                    self.reverse(nums, i+1, length-1)
                    return

        self.reverse(nums, 0, length-1)  #代表是,降序排列

        #翻转nums[left...... right]
    def reverse(self, nums, left, right):
        while left < right:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1
            right -= 1

287.寻找重复数

在这里插入图片描述

环形链表在这里插入图片描述

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        def next(i):
            return nums[i]
        slow = fast = 0
        while True:
            slow = next(slow)
            fast = next(next(fast))
            if slow == fast:
                break
        slow = 0
        while slow != fast:
            slow = next(slow)
            fast = next(fast)
        return slow  #入环的地方

哈希表

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        hmap = set()
        for num in nums:
            if num in hmap: 
            	return num
            else:
	            hmap.add(num)
        return -1

相关推荐

  1. Leetcode】top 100 贪心算法

    2024-07-10 04:56:08       32 阅读
  2. LeetCode算法练习top100:(10贪心算法

    2024-07-10 04:56:08       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 04:56:08       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 04:56:08       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 04:56:08       57 阅读
  4. Python语言-面向对象

    2024-07-10 04:56:08       68 阅读

热门阅读

  1. WPF设置全局样式

    2024-07-10 04:56:08       25 阅读
  2. AJAX学习笔记上(学习自用)

    2024-07-10 04:56:08       29 阅读
  3. linux之段错误的分析

    2024-07-10 04:56:08       26 阅读
  4. 三级_网络技术_11_路由设计技术基础

    2024-07-10 04:56:08       19 阅读
  5. Ubuntu上如何安装nvm包管理器

    2024-07-10 04:56:08       24 阅读
  6. python项目常见使用的传参调试方法

    2024-07-10 04:56:08       31 阅读
  7. 深入理解Spring Boot中的数据库优化

    2024-07-10 04:56:08       27 阅读
  8. HOW - React Router v6.x Feature 实践(react-router-dom)

    2024-07-10 04:56:08       22 阅读
  9. Mysql:时区问题

    2024-07-10 04:56:08       18 阅读
  10. WebSocket 双向通信

    2024-07-10 04:56:08       24 阅读
  11. 3102.最小化曼哈顿距离

    2024-07-10 04:56:08       25 阅读
  12. Power BI数据分析可视化实战培训

    2024-07-10 04:56:08       21 阅读