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

LeetCode100 -- Day1

1.动态规划:118、279、322

(1)118 杨辉三角

可以看做是一个下三角形式的数组.

每一行的第一个和最后一个元素均为1,中间其他元素是自己头顶和左上方元素之和。

class Solution(object):def generate(self, numRows):results=[[1]]       ## 第一行只有一个1for i in range(1, numRows):pre_row = results[i-1]      ## 获取上一行cur_row = [1]   ## 每一行的第一个元素为1for j in range(1,i):    ## 中间[1,i-1]的元素为头顶和左上方元素之和cur_row.append(pre_row[j]+ pre_row[j-1])cur_row.append(1)   ## 每一行最后一个元素为1results.append(cur_row)return results

(2)279 完全平方数

  • dp[i]:和为 i 时所需的最少完全平方数的数量,目标是计算 dp[n]。

  • 状态更新:对于每个数字i(从 1 到 n),考虑所有可能的完全平方数 j²( j² ≤ i),如果使用 j² 作为其中一个平方数,那么剩余部分为 i−j² ,其最少平方数数量为 dp[ i - ],因此,dp[i] 应该是所有可能的 j( j² ≤ i) 中,dp[ i - j² ] + 1 的最小值。

import math
class Solution(object):def numSquares(self, n):""":type n: int:rtype: int"""dp=[float('inf')]*(n+1)    ## 初始化为极大值dp[0]=0for i in range(1,n+1):max_j = int(math.sqrt(i))for j in range(1, max_j+1):dp[i]=min(dp[i], dp[i-j*j]+1)return dp[n]

(3)322 零钱兑换

  • dp[i]:和为 i 使用的硬币最少个数

  • 状态更新:
    遍历coins数组中的coin,如果coin<=i,则可能会用到这枚coin,那么就要查看剩余金额使用的硬币最小个数 → dp[i-coin]+1
    如果用不到这枚coin,则金额不变 → dp[i]

class Solution(object):def coinChange(self, coins, amount):if amount == 0:return 0dp = [float('inf')]*(amount+1)dp[0] = 0for i in range(1, amount+1):for coin in coins:if coin<=i:dp[i] = min(dp[i], dp[i-coin]+1)if dp[amount] == float('inf'):return -1return dp[amount]

2.贪心算法:121

在每一步选择中都采取在当前状态下​​最好或最优(即最有利)的选择

与动规不同之处:动态规划需要保存子问题解并重用,而贪心算法​​不会回头改变之前的选择​

(1)121 买卖股票的最佳时机

本质上:最大利润 = 最高价 - 最低价,同时最高价对应的index必须大于最低价

class Solution(object):def maxProfit(self, prices):max_profit = 0min_price = prices[0]for cur_price in prices:if cur_price < min_price:min_price = cur_priceelif cur_price - min_price > max_profit:max_profit = cur_price - min_pricereturn max_profit

3.二分查找:35、74

(1)35 搜索插入位置

class Solution(object):def searchInsert(self, nums, target):n = len(nums)left = 0right = n-1while left<=right:mid = (left+right)//2if target == nums[mid]:return midelif target < nums[mid]:right = mid-1else:left = mid+1return left

(2)74 搜索二维矩阵

class Solution(object):def searchMatrix(self, matrix, target):m = len(matrix)n = len(matrix[0])if target < matrix[0][0] or target > matrix[-1][-1]:return Falsetop, bottom = 0, m-1## 先找在哪一行while top <= bottom:row_mid = (top+bottom)//2## target比当前行最小值还小→往上找if matrix[row_mid][0]>target:bottom = row_mid-1## target比当前行最大值还打→往下找               elif matrix[row_mid][-1]<target:top = row_mid+1else:   ## 行内查找left, right = 0, n-1while left<=right:col_mid = (left+right)//2if matrix[row_mid][col_mid]==target:return Trueelif matrix[row_mid][col_mid]<target:left = col_mid+1else:right = col_mid-1## 没找到target→不存在return Falsereturn False

4.二叉树:94、104、102、226

(1)94 二叉树中序遍历

递归法:

class Solution(object):def inorderTraversal(self, root):results=[]def traverse(node):if not node:returntraverse(node.left)results.append(node.val)traverse(node.right)traverse(root)return results

迭代法:

        stack=[]results=[]cur_node=rootwhile cur_node or stack:## 找到最左节点while cur_node:     stack.append(cur_node)cur_node=cur_node.left## 处理根节点cur_node=stack.pop()results.append(cur_node.val)## 处理右子树cur_node=cur_node.right return results    

(2)104 二叉树最大深度

class Solution(object):def maxDepth(self, root): if not root:return 0left = maxDepth(root.left)right = maxDepth(root.right)    return max(left,right)+1    

(3)102 二叉树层序遍历

from collections import deque
class Solution(object):def levelOrder(self, root):""":type root: Optional[TreeNode]:rtype: List[List[int]]"""if not root:return []results=[]quene=deque([root])while quene:cur_level=[]for _ in range(len(quene)):node = quene.popleft()cur_level.append(node.val)if node.left:   quene.append(node.left)if node.right:  quene.append(node.right)results.append(cur_level)return results

(4)226 翻转二叉树

class Solution(object):def invertTree(self, root):""" 后序遍历实现 """if not root:return """ 递归翻转左右子树 """self.invertTree(root.left)self.invertTree(root.right)""" 交换当前节点的左右子树 """root.left, root.right = root.right, root.left  return root

http://www.xdnf.cn/news/1320589.html

相关文章:

  • 【Linux指南】gcc/g++编译器:从源码到可执行文件的全流程解析
  • leetcode面试笔试-双指针题型总结
  • linux下查看 UDP Server 端口的启用情况
  • Redis 客户端接口介绍
  • Redis——基础篇
  • 【redis、ruoyi-vue】基于ruoyi-vue实现数据redis的增删改查
  • Java面试宝典:Redis高级特性和应用(发布 订阅、Stream)
  • [python学习记录1]python简介
  • 最小路径和
  • 在职老D渗透日记day19:sqli-labs靶场通关(第26a关)get布尔盲注 过滤or和and基础上又过滤了空格和注释符 ‘)闭合
  • 线程(基本概念和相关命令)
  • LeetCode热题100--104. 二叉树的最大深度--简单
  • Rust:实现仅通过索引(序数)导出 DLL 函数的功能
  • STM32单片机学习日记
  • 网络常识-SSE对比Websocket
  • 记一次安装OpenStack(Stein)-nova报错问题解决
  • 数据赋能(396)——大数据——抽象原则
  • 智能汽车领域研发,复用云原生开发范式?
  • 48.Seata认识、部署TC服务、微服务集成
  • http工作流程
  • C++算法竞赛:位运算
  • 前端项目练习-王者荣耀竞赛可视化大屏 -Vue纯前端静态页面项目
  • 服务器管理与配置学习总结
  • MYSQL-175. 组合两个表
  • JavaScript性能优化实战(四):资源加载优化
  • LeetCode 837.新 21 点:动态规划+滑动窗口
  • 【数据结构】堆和二叉树详解——上
  • 旋钮键盘项目---foc讲解(闭环位置控制)
  • 学习Python中Selenium模块的基本用法(5:程序基本步骤)
  • Linux817 shell:until,nfs,random