
算法
最懒的胖子
这个作者很懒,什么都没留下…
展开
-
旋转数组-python
题目描述:题解:1、先将整个数组反转,则会后k个就会放在了数组的头部,如果k等于32、将前半部分反转,再将后半部分反转即可需注意:核心思路:先将整个数组进行反转整个数组反转后:7,6,5,4,3,2,1将前3个反转: 5,6,7,4,3,2,1将后边的反转: 5,6,7,1,2,3,4...原创 2021-09-12 19:21:56 · 181 阅读 · 0 评论 -
非递减数组平方后排序
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。想法:看到本题,首先想到的是可能存在负数的情况,负负得正后数组就边无序了利用双指针的思路:1、先将整个数组分为两部分,分界点为index,则从0到index都是负数,从index到最后都是正数2、则平方后,从0到index是递减的,从index到最后是递增的3、此时就可以用到归并排序的思路,两个指针分别是index和index+1a. 前半部分从index往前遍历,后半部原创 2021-09-12 17:01:11 · 298 阅读 · 0 评论 -
leetcode14-最长公共子串-python
题目:题解:纵向扫描,取第一行的第i个,判断每一行的第i个是否相等class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if not strs: return "" length, count = len(strs[0]), len(strs) # 第一层遍历,遍历第几个元素 for i in range(l原创 2021-09-11 19:16:51 · 296 阅读 · 0 评论 -
leetcode9-判断回文数
题目:题解:step1:如果是负数,则一定不是回文数step2:采用双指针的思想,一个指针从头开始,一个指针从尾开始,则如果出现不相等,则不是回文数代码:class Solution: def isPalindrome(self, x: int) -> bool: if x < 0: return False x = str(x) low = 0 high = len(x)-1原创 2021-09-10 09:11:06 · 145 阅读 · 0 评论 -
二叉树相关算法题总结-python实现
题目一:平衡二叉树输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。...原创 2021-06-05 14:08:50 · 882 阅读 · 0 评论 -
动态规划经典例题-最长公共子序列-python
最长公共子序列问题描述:题解:以问题中为例:A='helloworld'B='loop'res[i][j]表示:截止到B的第i个字符和截止到A的第j个字符的最长公共子序列例如:res[2][5]=2表示第2行第5列,也就是lo和hello的最长公共子序列等于2 0 h e l l o w o r l d 0 0 0 0 0 0 0 0 0 0 0.原创 2021-05-17 00:19:37 · 3793 阅读 · 0 评论 -
滑动窗口解题技巧
目录滑动窗口题目简介最小覆盖子串滑动窗口题目简介什么样的问题可以归结为滑动窗口问题?最小覆盖子串题目:滑动窗口算法的思路说明:我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引左闭右开区间 [left, right) 称为一个「窗口」 我们先不断地增加 right 指针扩大窗口 [left, right),直到窗口中的字符串符合要求(包含了 T 中的所有字符) 此时,我们停止增加 right,转而不断增加 left 指针缩原创 2021-05-15 23:02:31 · 256 阅读 · 0 评论 -
动态规划-最大子数组-python
题目:题解:按照动态规划常规思想,一般是这样定义 dp 数组,nums[0..i] 中的「最大的子数组和」为 dp[i]但是你能用 dp[i] 推出 dp[i+1] 吗?比如,一个数组[-3,4,-1,2,-6,1,4],dp[4]=dp[1] +dp[2] +dp[3]=5,也就是说从0~4个位置的最大子数组的和是5,那你能通过dp[4]推到出dp[5]么?实际上是不行的,因为子数组一定是连续的,按照我们当前 dp 数组定义,并不能保证 nums[0..i] 中的最大子数组与 nu原创 2021-05-11 23:28:57 · 695 阅读 · 0 评论 -
最长递增子序列-python
题目:题解:先举例说明:按照动态规划的步骤:明确 base case -> 明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义,来确定每一个步骤明确 base case:dp[i] 初始值为 1,因为以 nums[i] 结尾的最长递增子序列起码要包含它自己 明确状态: 明确选择: dp的定义:dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度则伪代码如举例中所示代码:def lengthOfLIS(arr):原创 2021-05-10 23:36:46 · 499 阅读 · 0 评论 -
矩阵的最小路径和-python
题目描述:给定一个n * m的矩阵a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。详解:利用动态规划的思想,对于m*n矩阵,dp[i][j]的位置记录着第i行第j列位置的最小路径和第一行 只能从左往右 第一列只能从上往下 第二行和第二列之后每个位置的值为,上方和左方取最小值+当前位置的值,matrix[i][j] = min(matrix[i - 1][j], matrix[i][j - 1]) + mat...原创 2021-05-10 00:30:29 · 764 阅读 · 0 评论 -
动态规划详解
目录简介举例斐波那切数列暴力递归带备忘录的递归解法凑零钱问题简介动态规划一般是解决最值问题,运筹学中的一种最优化方法,比如求最长递增子序列,最小编辑距离核心问题:穷举,但是动态规划存在重叠子问题,暴力穷举效率较低所以需要一个备忘录或者DP table来优化穷举过程,避免一些不必要的计算穷举还需要写出正确的状态转移方程所以整体步骤是:明确 base case -> 明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义# 初始原创 2021-05-09 20:03:00 · 107 阅读 · 0 评论 -
反转数字-GO
题目:题解:取x%10取最后一位,然后组成新的数字 越界条件,res>(1<<31)-1 || res< -(1<<31)-1代码:package main/** * * @param x int整型 * @return int整型*/func reverse( x int ) int { // write code here res:=0 for x!=0{ res = res*10+原创 2021-05-09 15:14:55 · 198 阅读 · 0 评论 -
合并两个有序数组-python
题目描述:两个有序数组A和B,长度分别为m,n。将两个数组合并到A中题解:将B和并到A中,如果从前往后依次合并,则每一次在数组A中插入一个值,都需要后边节点依次往后移,改操作浪费空间可以从数组A的m位置和B的n位置开始比较,从m+n-1的位置开始放最大值,依次往前排代码:## # @param A int整型一维数组 # @param B int整型一维数组 # @return void#class Solution: def merge(self , A, m, B,原创 2021-05-09 14:41:33 · 380 阅读 · 0 评论 -
两个栈实现一个队列-Python
问题描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题解:有两个栈,例如abcd分别入栈,入栈1位:dcba,出栈到栈2中为abcd,此时如果出栈2的顺序就是先a,在bcd,符合了队列的特性pop操作:出队列时,先判断第二个栈有没有内容,如果有,则直接从栈2中出,如果没有,则将栈1中的内容压入栈2,在从栈2出push操作:直接push到栈1中即可# -*- coding:utf-8 -*-class Solution: def __i原创 2021-05-07 23:17:39 · 174 阅读 · 0 评论 -
判断链表中是否有环-Python
题目:判断给定的链表中是否有环。如果有环则返回true,否则返回false。你能给出空间复杂度O(1)的解法么?题解:最简单的一种方式就是快慢指针,慢指针针每次走一步,快指针每次走两步,如果相遇就说明有环,如果有一个为空说明没有环代码:# class ListNode:# def __init__(self, x):# self.val = x# self.next = None## # @param head ListNode类 # @原创 2021-05-07 23:00:26 · 627 阅读 · 0 评论 -
合并两个有序链表-Python
题目:将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。详解:定义一个新的空链表,判断两个链表:如果L1当前节点的值比L2当前节点的值小,则取L1的节点赋值给新链表 否则。将L2的节点赋值给新链表注意:如果两个其中一个为空,则直接将不为空的后续赋值给新链表代码如下:# class ListNode:# def __init__(self, x):# self.val = x# self.原创 2021-04-27 00:22:58 · 371 阅读 · 0 评论 -
数组中超过一半的数字-python
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。详解:初始时,先定义一个length用来记住某个数字出现最多的次数,value记录出现最多次数的具体值定义一个map,key存具体值,value存次数,当遍历到某个值时判断该值出现的次数是不是大于length,如果更大,则更新length和value代码: def Mo原创 2021-04-24 21:51:53 · 223 阅读 · 0 评论 -
括号序列-python
题目描述:给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。题解:利用一个栈,当一个字符是"]","}",")",判断栈顶元素是不是对应的左半边,如果是则出栈,如果不是,则继续进栈注意:当是空栈时,直接入栈即可代码:def isValid(s): stack = [] s_list = list(s)原创 2021-04-24 21:39:34 · 750 阅读 · 0 评论 -
最长无重复子串-Python版
题目描述:给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。输入:[2,3,4,5],返回4输入:[2,2,3,4,3] 返回3题解:借用一个列队,把元素push到队列中,如果有重复,则就把队首的元素移除,保证队列中的内容是不重复的步骤:初始状态:声明一个队列queue,一个最大长度max_length=1 遍历list 先判断第i个值是不是在queue中,如果在,在依次移除 将第i个值在push到队列中 判断max_length,.原创 2021-04-24 20:16:44 · 1009 阅读 · 1 评论 -
两数之和-python
题目描述:给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2解法一:简单粗暴,先取第i个值,然后依次用第i个值与后边的每一个值相加,如果等于target则找到了两个索引def tw.原创 2021-04-24 18:17:13 · 285 阅读 · 1 评论 -
排序算法-Python
冒泡排序事件复杂度是o(n的平方),会改变数组的顺序,稳定的排序,即如果两个3同时出现,不会改变两个3原有的位置if __name__ == '__main__': # 升序 arr = [3, 5, 1, 0, 10, 2, 4] for i in range(1, len(arr)): for j in range(0, len(arr) - i): if arr[j] > arr[j + 1]:原创 2021-04-23 00:29:22 · 74 阅读 · 0 评论 -
反转链表-python
题目:输入一个链表,反转链表后,输出新链表的表头。分析:先声明三个节点,分别记录当前,前一个和后一个 记录下一个 next = cur.next 修改节点指向,cur.next = pre 分别后移 pre = cur,cur=next# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass .原创 2021-04-22 23:50:24 · 98 阅读 · 0 评论 -
旋转数组中的最小数组-python
题目:把一个数组开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出数组的最小元素例如:数组{3,4,5,1,2},输出1解析:因为数组是递增的,所以数组在一定程度上是排序的,我们可以考虑二分法用两个指针分别指向第一个和最后一个元素,则最后一个元素应该小于等于第一个元素的如果中间的元素大于最后一个元素,则说明最小的元素在后半部分,反之则在前半部分终止条件是:考虑的特例:1、 一个数组前0个元素转到了数组的后边,也就是原数组2、第一.原创 2021-04-01 09:57:32 · 111 阅读 · 0 评论 -
剑指offer-二叉树的下一个节点-python
问题:给定一个二叉树和其中一个节点,如何找到中序遍历序列的下一个节点?树中的节点除了有两个分别指向左,右子节点的指针,还有一个指向父节点的指针解析:该二叉树的中序遍历为:dLbkeahic不需要关注左子树,因为中序遍历是左中右,则左子树一定是在要找的节点的前边 如果所找节点有右子树,则下一个节点是右子树中最左子节点,例如:a的下一个节点是h 如果所找节点无右子树 分为自己是父节点的左节点,那下一个节点就是自己的父节点 自己是父节点的右节点,较为复杂,则沿着指向父节点的指针一直.原创 2021-03-26 09:33:06 · 95 阅读 · 0 评论 -
python-重建二叉树
题目:输入二叉树的前序遍历和中序遍历,重建二叉树,输出二叉树的头结点,假设前序和中序中的数字没有重复解析:前序遍历是 中左右中序遍历是 左中右由此可知,一颗二叉树中前序遍历的第一个数字是根节点,中序遍历中,根节点在中间,且把一棵树分为左右两部分我们能够分别找到左子树和右子树,那我们就可以用递归的方法分别找到左子树和右子树...原创 2021-03-24 09:36:22 · 275 阅读 · 0 评论