动态规划算法
509.斐波那契数斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
12F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1
123输入:n = 2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
123输入:n = 3输出:2解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
123输入:n = 4输出:3解释:F(4) = F(3) + F(2) = 2 + 1 = 3
代码:
123456789101112131415# 动态规划 (注释版。无修饰)class Solution: def fib( n: int) -> int: if n==0: return None # 初始化 dp=[0]*(n+1) dp[0]=0 dp[1]=1 ...
贪心算法
455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
示例 1:
123456输入: g = [1,2,3], s = [1,1]输出: 1解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。所以你应该输出1。
示例 2:
123456输入: g = [1,2], s = [1,2,3]输出: 2解释: 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。你拥有的饼干数量和尺寸都足以让所有孩子满足。所以你应该输出2.
思路:
对小孩胃口和饼干进行排序
遍历饼干 相当于拿饼干一个个尝试喂
如果小孩人数还没有喂完 并且能满足胃口 那么跳到下个小孩
代码:
12345 ...
管理系统接口纯本地手写实现
1、登录接口123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869Mock.mock('/api/login', 'post', options => { // 本地个人数据以及个人详细数据 let user = [ { username: 'aaabbb7891', password: '123456', repassword: '123456', token: 'aaa', id: 230 }, { username: '78798', password: '123456', r ...
回溯算法
77.组合给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
12345678910输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]
示例 2:
12输入:n = 1, k = 1输出:[[1]]
代码:
1234567891011121314class Solution: def combine(self, n: int, k: int) -> List[List[int]]: res=[] #存放符合条件结果的集合 path=[] #用来存放符合条件结果 def backtrack(n,k,startIndex): if len(path) == k: res.append(path[:]) return for i in range(startIndex,n ...
二叉树算法
二叉树的递归遍历代码:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152class TreeNode: def __init__(self, value): self.value = value self.left = None self.right = None# 前序遍历-递归-LC144_二叉树的前序遍历class Solution: def preorderTraversal(self, root) : # 保存结果 result = [] def traversal(root): if root == None: return result.append(root.val) # 前序 traversal(root.left) # 左 ...
栈与队列算法
232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
示例 1:
12345678910111213输入:["MyQueue", "push", "push", "peek", "pop", "empty"][[], [1], [2], ...
字符串算法
344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
12输入:s = ["h","e","l","l","o"]输出:["o","l","l","e","h"]
示例 2:
12输入:s = ["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]
思路:
使用双指针,定位到起始和结尾
调换起始和结尾的数据
起始+1,结尾-1
代码:
12 ...
哈希表算法
242.有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true
示例 2: 输入: s = “rat”, t = “car” 输出: false
说明: 你可以假设字符串只包含小写字母。
思路:
原假设中只包含26个字母,使用数组来记录s中字母出现的次数
对t字符串进行遍历,由此对数组值来进行减操作
判断数组值是否全为0,若是则s与t为字母异位符
代码:
123456789101112131415class Solution(object): def isAnagram( s, t): record=[0]*26 for i in s: record[ord(i)-ord('a')]+=1 for j in t: record[ord(j)-ord('a')]-=1 ...
链表算法
203.移除链表元素题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
思路:
使用cur来遍历链表结点
找到结点值为val的结点,对cur.next赋值为cur.next.next
代码:
123456789101112131415class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = nextclass Solution: def removeElements(head, val): tem_head=ListNode(next=head) cur=tem_head while( ...
数组算法
704.二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
123输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4
示例 2:
123输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1
提示:
你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。
思路:
主要是有三个指针来解决,分别是left,right,mid
分别调整三个指针的指向来找到目标target
如果mid比target小,left赋值为mid+1
如果mid比target大,right赋值为mid-1
如果mid=target,返 ...