
天天刷leetcode
爱学习的吨吨a
扣jio小硕,研究方向机器学习深度学习算法,时空数据挖掘。
分享平时学习到的新知识,论文,算法等等
展开
-
天天刷leetcode——60. 第k个排列
60. 第k个排列题目描述给定 n 和 k,返回第 k 个排列。解题思路1. 直接回溯算法DFS求出所有的排列,然后确定k个 def getPermutation(self, n: int, k: int) -> str: nums = [str(i+1) for i in range(n)] def back(nums,track): if len(track) == len(nums): tm原创 2020-09-06 15:22:54 · 176 阅读 · 0 评论 -
天天刷leetcode——300. 最长上升子序列,1143. 最长公共子序列,674. 最长连续递增序列,152.乘积最大子数组
300. 最长上升子序列题目描述给定一个无序的整数数组,找到其中最长上升子序列的长度。解题思路1. 动态规划状态:dp[i]dp[i]dp[i] 表示长度为iii的序列的最长上升子序列的长度状态转移方程:递增序列,只需要找到nums[i]前面哪些结尾比7小的子序列,然后把7接到最后,就可以形成一个新的递增子序列。即,新的子序列就是找到的数后加个7,长度加一。初始条件:dp[0]dp[0]dp[0] = 1 def lengthOfLIS(self, nums: List[int]) -原创 2020-09-01 22:38:32 · 228 阅读 · 0 评论 -
天天刷leetcode——17.电话号码的字母组合
17. 电话号码的字母组合题目描述给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。解题思路1. 回溯,用DFS依旧是回溯def func(digits): if not digits: return [] phonemap = { "2": "abc", "3": "def", "4": "ghi", "5原创 2020-08-26 15:10:52 · 194 阅读 · 0 评论 -
天天刷leetcode——动态规划(子串们的故事)
647. 回文子串解题思路1. 暴力求解 def countSubstrings(self, s: str) -> int: res = 0 def cal(s): if s[::-1] == s: return 1 else: return 0 for i in range(len(s)): for j i原创 2020-08-19 12:40:54 · 201 阅读 · 0 评论 -
天天刷leetcode——分治问题
分治问题1. 主要思想将一个问题分成若干个子问题,知道子问题满足边界条件。然后挨个解决子问题。将子问题合并,最后层层合并就可以得到原问题的解。2. 算法步骤分:将原问题拆分为子问题(性质相同,相互独立)求解:将这些规模更小的子问题逐个解决合并:将已解决的子问题逐层合并,最终得出原问题的解3. 适用哪些情况原问题的计算复杂度随着问题的规模的增加而增加原问题能够被分解成更小的子问题子问题的结构和性质与原问题一样,并且相互独立,子问题之间不包含公共的子问题原问题分解的子问题的解可以合并原创 2020-08-19 10:45:11 · 180 阅读 · 0 评论 -
天天刷leetcode——53. 最大子序和
53. 最大子序和题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。解题思路1. 动态规划dp[i]dp[i]dp[i] 表示下标前i个元素所组成的连续子数组的最大和。初始状态:dp[0]=0dp[0] = 0dp[0]=0如果dp[i−1]<=0dp[i-1]<=0dp[i−1]<=0(前一个元素对我们没有正的贡献)dp[i]=nums[i]dp[i] = nums[i]dp[i]=nums[i],否则我们需要把正原创 2020-08-18 22:54:33 · 163 阅读 · 0 评论 -
天天刷leetcode——14.最长公共前缀
14.最长公共前缀题目描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。解题思路前缀是公共的,可以从任意一个元素中获得。首先将第一个元素设置为基准元素。依次将基准元素和后面的元素进行比较,不断更新基准元素,直到基准元素和所有元素都满足最长公共前缀的条件。 def longestCommonPrefix(self, strs: List[str]) -> str: if len(strs) < 1:原创 2020-08-14 21:48:18 · 189 阅读 · 0 评论 -
天天刷leetcode——7. 整数反转
7. 整数反转题目描述给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。不能溢出。解题思路1. 暴力将整数转成list,反转之后判断最后一位是什么。再拼接起来。最后判断是否溢出。 def reverse(self, x: int) -> int: x = list(str(x)) s = x[::-1] res = 0 if s[-1] == '-': s.pop()原创 2020-08-10 21:15:20 · 245 阅读 · 0 评论 -
天天刷leetcode——88. 合并两个有序数组
88. 合并两个有序数组题目描述给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。解题思路1. 双指针(从前往后遍历)复制num1中的元素为num1_copy。清空num1。分别用指针p1和p2指向num1和num2。进行比较,小的append到num1。比到最后,剩下的直接append到num1就可以了。 def merge(self, nums1: List[int], m: int, nums2: List原创 2020-08-10 18:46:06 · 191 阅读 · 0 评论 -
天天刷leetcode——二分查找
二分查找1. 应用场景找一个数,寻找左侧边界、寻找右侧边界2. leetcode——704. 二分查找def binarysearch(nums, target): left = 0 right = len(nums) - 1 while left <= right: mid = left + (right-left) // 2 print(mid) if nums[mid] == target:原创 2020-08-08 23:46:35 · 160 阅读 · 0 评论 -
天天刷leetcode——191 位1的个数
leetcode——191 位1的个数编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。解题思路1. 用python中的bin() def hammingWeight(self, n: int) -> int: b = bin(n) return b.count('1')2. 位运算位运算符说明<<按位左移,左移动n位相当于乘以2的n次方>>原创 2020-08-07 23:11:22 · 168 阅读 · 0 评论 -
天天刷leetcode——51 N皇后
题目描述输出N皇后的所有解法解题思路1. 回溯可以使用回溯。决策树的每一层表示棋盘上的每一行,每个节点可以作出的选择是,在该行的任意一列放置一个皇后。代码框架:def traveser(track, choiceList): ''' :param track: 路径 :param choiceList: 选择列表 :return: res ''' # if 满足结束条件: # result.append(track) #原创 2020-08-06 12:54:44 · 158 阅读 · 0 评论 -
天天刷leetcode——22 括号生成
题目:Leetcode22 括号生成题目描述数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。解题思路1. 归纳法解题n = 1时,result = ["()"] 1个n = 2时,result =[ “()()”,"(())"] 2个n = 3时, result = ["()()()","(())()","()(())","((()))","(()())"] 5个2. 回溯算法——DFS(深度优先搜索)以n =2 为例,构造的多叉树如下:总原创 2020-08-05 18:33:08 · 134 阅读 · 0 评论 -
天天刷leetcode——BFS和DFS其应用
BFS(广度优先遍历)使用队列实现由于图会存在回路和重复值。因此需要有一个判断重复的列表visited。对于树,visited列表可以省略。如果不需要确定当前遍历到了哪一层,BFS代码如下def BFS(graph,start,end): queue = [] queue.append([start]) visited.append(start) while queue: # 队列第一个元素出去 node = queue.pop(0) # 访问列表添加元素 visited.a原创 2020-08-05 17:32:27 · 224 阅读 · 0 评论 -
天天刷leetcode——343整数拆分
整数拆分题目描述给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。解题思路1. 动态规划设dp[i]dp[i]dp[i] 表示正整数iii,被拆分为至少两个正整数后的最大乘积。那么 dp[0]=dp[1]=0dp[0] = dp[1] = 0dp[0]=dp[1]=0假设iii首先可以拆成jjj。则有以下两种情况:将iii分为jjj和i−ji-ji−j的,且i−ji-ji−j不能再被分了。此时的乘积就是j×(i−j)j×(i-j)j×(原创 2020-07-30 17:47:35 · 169 阅读 · 0 评论 -
天天刷leetcode——122 买卖股票的最佳时机
122 买卖股票的最佳时机题目描述给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。解题思路1. 贪心算法因为同一天可以同时买卖,所以只要前一天比后一天价格低就买入,利润就是后一天剪前一天。 def maxProfit(self, prices: List[int]) -> int: res = 0 for i in range(len(price原创 2020-07-30 12:57:08 · 162 阅读 · 0 评论 -
天天刷leetcode——46.全排列,78.子集,39. 组合总和(都用DFS)
全排列地址: https://leetcode-cn.com/problems/permutations/.题目描述给定一个 没有重复 数字的序列,返回其所有可能的全排列。解题思路1. 回溯算法回溯的核心就是一个多叉树的遍历过程。只需要从根遍历这个树,记录路上的数,所有路径就是全排列。回溯算法的核心架构:def traveser(track, choiceList): ''' :param track: 路径 :param choiceList: 选择列表 :原创 2020-07-29 20:33:00 · 174 阅读 · 0 评论 -
天天刷Leetcode——322. 零钱兑换
问题描述给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。Leetcode 322 零钱兑换: https://leetcode-cn.com/problems/coin-change/.解题思路1. 初级动态规划——不带存储单元的递归分析:该问题具有最优子结构。因为如果要求amount = n的最少硬币数(原问题),可以转化为amount = n-1(子问题)再加上1(一个一块的硬币原创 2020-07-24 23:56:57 · 718 阅读 · 0 评论 -
天天刷leetcode——509. 斐波那契数
斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。Leetcode 509: https://leetcode-cn.com/problems/fibonacci-number/.解题思路1. 暴力递归 def fib(self, N: int) -> int: if N ==1 or N ==2 : return 1 return fib(N-1)+f原创 2020-07-24 14:01:05 · 224 阅读 · 0 评论 -
天天刷leetcode——剑指 Offer 06. 从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。剑指 Offer 06. 从尾到头打印链表。1解题思路:1. 原链表进栈 def reversePrint(self, head: ListNode) -> List[int]: tmp = [] while head: tmp.append(head.val) head = head.n原创 2020-07-15 15:51:44 · 110 阅读 · 0 评论 -
天天刷leetcode——剑指 Offer 05. 替换空格
题目:offer 05. 替换空格题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。[1]解题思路1. 遍历字符串,找到空格,使用replace替换 def replaceSpace(self, s: str) -> str: for i in range(len(s)): if s[i] == " ": s = s.replace(s[i], '%20') return s原创 2020-07-15 15:09:50 · 157 阅读 · 0 评论 -
天天刷leetcode——剑指 Offer 04. 二维数组中的查找
剑指 Offer 04. 二维数组中的查找题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。Leetcode二维数组中的查找。1解题思路1. 从左下角开始遍历题目要求判断target是否在数组中,所以肯定是要遍历数组的,鉴于这个二维数组的特点,可以从左下角开始走起,遍历到的数比targert大就往上走,比target小就往右走。图片详解:Code:原创 2020-07-12 12:47:24 · 202 阅读 · 0 评论 -
天天刷leetcode——剑值offer03.数组中的重复数字
剑值offer03.数组中的重复数字题目描述思路1. 遍历列表,用字典进行统计2. 排序,然后遍历,计算相邻两个数据是否想等即可。3.用set函数,挨个往set中add数字,如果set的len不等于i+1,那说明肯定有重复的。references剑值offer03.数组中的重复数字。1题目描述在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。思路1. 遍历列表,用原创 2020-07-12 10:56:46 · 140 阅读 · 0 评论