leecode
文章平均质量分 53
eight_Jessen
这个作者很懒,什么都没留下…
展开
-
collections.deque()
collections.deque()的速度比list构建的queue快原创 2021-08-26 00:33:01 · 125 阅读 · 0 评论 -
数据结构:堆
堆一、数据结构及实现数据结构:理解上是完全二叉树,实现上实验数组实现。模拟方式:编号为1的节点为根节点。编号为n的节点,左节点为 2n2n2n,右节点2n+12n + 12n+1,父节点n//2n // 2n//2如果节点数目为nnn,那么n/2n/2n/2的节点都是叶子节点。堆的两个要素:是完全二叉树并且父节点的值一定大于(大根堆)或小于(小根堆)它的左右孩子。二、堆的属性大根堆和小根堆大根堆:父节点的值比每一个子节点的值都要大。在小根堆,父节点的值比每一个子节点的值都要小。这个属原创 2021-08-25 17:51:11 · 80 阅读 · 0 评论 -
leetcode23. 合并K个升序链表
leetcode 23 合并k个升序链表面试的时候面试官跟我讨论这道题。之前没做过,面试的时候也是临时想了一些方法,就是方法不够好的时候面试官会一直引导。回来后看了这道题。两个数组合并时间复杂度O(2n)1、每次两个两个数组合并每次合并次数 k2i\frac{k}{2^i}2ik,时间复杂度O(2in)O(2^in)O(2in)总的时间复杂度 ∑ik2i×2in\sum_i \frac{k}{2^i} \times 2^in∑i2ik×2in ,O(knlogk)O(knlogk)O(k原创 2021-08-25 17:09:30 · 115 阅读 · 0 评论 -
leetCode笔试刷题二 双指针法
一、算法讲解主要用于遍历数组,两个指针指向不同元素,也可以延伸到多个数组的多个指针。若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域即为当前的窗口),经常用于区间搜索。若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是排好序的。二、题型2.1 两数之和167 两数之和给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。指定两个指针,左指针指向数组的开头,右指针原创 2021-06-29 09:49:32 · 145 阅读 · 0 评论 -
leetcode 96. 不同的二叉搜索树
题目描述给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。思路动态规划可以从1到n遍历所有数,每次把当前的数作为根,小于当前的数分在左边,大于当前的数分在右边。对左子树,右子树,也用相同的方法遍历。可以定义两个函数:Gn: 长度为n的数可以构造的二叉搜索树的数目F(i,n): 以 i 为根、序列长度为 n 的不同二叉搜索树个数 (1≤i≤n)。所以有Gn=∑i=1nF(i,n)Gn = \sum_{i =原创 2021-06-23 23:48:09 · 108 阅读 · 2 评论 -
LeetCode笔试刷题一. 贪心算法
一、算法解释贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。二、题型2.1 分配问题455. 分发饼干饥饿度最小的最容易吃饱,将饥饿度从小到大排序,然后饼干也从小到大排序。456. 分发糖果糖果问题,一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果。思路:从左到右遍历一遍,再从右到左遍原创 2021-06-20 17:50:55 · 191 阅读 · 0 评论 -
leetcode 222.完全二叉树的节点:二分法/深度遍历法
1、题目描述给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例1:输入:root = [1, 2, 3, 4, 5, 6]输出:6示例2:输入:root = []输出:0示例3:输入:root = [1]输出:1 # 至于为什么要这么搜索,这里是找到原创 2021-05-03 12:08:16 · 218 阅读 · 0 评论 -
leecode144. 94.145. 树的遍历合集:前序、中序、后序,递归法、迭代法
1. 树的前序、中序、后序遍历这里的前序,中序,后序指的是根节点。如果是前序,则遍历顺序为 根节点-左节点-右节点如果是中序,则为 左-根-右如果是后序,则为 左-右-根1.1 树的前序遍历比如对这颗树,前序遍历指先遍历跟节点,那么第一遍历的是F,存储遍历的表记为[F][F][F]接下来遍历左节点,B,B也是根节点,加入遍历的列表,然后遍历B的左节点A,A加入,然后遍历A的左节点右节点,都不存在,则返回A的上个节点B,遍历B的右节点,此时为[F,B,A][F, B, A][F,B,A]B的原创 2021-03-13 22:31:52 · 113 阅读 · 0 评论 -
leecode 978. 动态规划:最长湍流子数组
1.题目描述当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:若 i<=k<ji <= k < ji<=k<j,当 kkk 为奇数时, A[k]>A[k+1]A[k] > A[k+1]A[k]>A[k+1],且当 k 为偶数时,A[k]<A[k+1]A[k] < A[k+1]A[k]<A[k+1];或 若 i<=k<ji <= k < ji<=k<原创 2021-03-12 20:51:58 · 97 阅读 · 0 评论 -
leecode 300. 动态规划最长递增子序列
1. 题目描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。输入:nums = [0,1,0,3,2,3]输出:4输入:nums = [7,7,7,7,7,7,7]原创 2021-03-12 17:24:34 · 148 阅读 · 0 评论 -
leetcode: 剑指Offer 35. 复杂链表的复制 哈希表法
题目描述请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]输入:head = [[3,null],[3,0],[3,null]]输出:[[3,null],[3,0],[原创 2021-03-08 16:50:29 · 157 阅读 · 1 评论 -
leetcode: 链表.206.反转链表 迭代法、递归法、列表存储法
题目描述反转一个单链表示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解题思路1.迭代方法从头开始遍历链表。如果是空链表或者只有一个节点,则直接返回。如果不是,则将节点的next指向前一个节点,注意,原来的head的next此时为空。我们需要两个指针,一个指向当前节点p,一个指向下个节点q。修改完当前节点后,让p=q,q指向下个节点,迭代下去,直到链表结尾。class原创 2021-03-06 17:05:34 · 92 阅读 · 0 评论 -
leetcode:双指针 287. 寻找重复数 三种方法
题目描述给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。示例:输入:nums = [1,3,4,2,2]输出:2输入:nums = [3,1,3,4,2]输出:3输入:nums = [1,1]输出:1输入:nums = [1,1,2]输出:1解题思路1.使用python里面set得到出现的数字,再使用count得到每个数出现的次数原创 2021-03-05 22:19:52 · 323 阅读 · 0 评论 -
leetcode: 双指针 86.分隔链表
题目描述给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置示例输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]示例2:输入:head = [2,1], x = 2输出:[1,2]思路用两个指针p1p1p1, p2p2p2,当所在节点的值小于xxx的时候,两个指针都移动,当节点的值开始大于或等于xxx的原创 2021-03-05 20:23:21 · 125 阅读 · 1 评论 -
leetcode 链表:141. 142.环形链表
题目描述给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。示例1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中原创 2021-03-05 17:43:52 · 102 阅读 · 0 评论 -
leetcode:剑指Offer 22 链表的倒数第K个节点和链表的中间节点
题目描述链表的倒数第K个节点、链表的中间节点,都使用快慢指针的方法解决输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.解题思路使用1个指针,先移动k-1步(因为题目最后一原创 2021-03-05 16:44:15 · 120 阅读 · 0 评论 -
leetcode 剑指Offer 21.调整数组顺序使奇数位于偶数前,双指针20ms超过98%
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。解题思路1、双指针法使用两个指针,一个指向输入list的起始位置p1,一个指向末端位置p2。p1逐步向后移动,直到遇到偶数p2逐步向前移动,直到遇到奇数同时每次判断,p1,p2是否刚好满足同时p1指向偶数,p2指向奇数,此时交换p1,p2的指,p1,p2继原创 2021-03-05 10:37:26 · 78 阅读 · 1 评论 -
leetcode:剑指Offer 50. 第一个只出现一次的字符
题目描述:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "解题思路:思路1. 有序哈希表将输入s遍历一遍,同时用一个字典存储每个字符出现的次数。然后遍历字典,返回第一个次数为1的字符,遍历完没有找的的话则返回空格。代码:class Solution(object): def firstUniqChar(self, s): """原创 2021-03-04 16:03:18 · 118 阅读 · 1 评论 -
leetcode:剑指 Offer 49. 丑数,动态规划
题目描述我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。解题思路:每个丑数都是由2,3,5相乘得到的,如果已经得到n−1n - 1n−1个数,则第nnn个数可以由前面的数得到,并且是有一定规律的,本题属于动态规划。我们即第n个数为LnL_nLn,则有Ln=min(La∗2,Lb∗3,Lc∗5)原创 2021-03-04 12:01:22 · 144 阅读 · 1 评论 -
leetcode: 剑指Offer 16.数值的整数次方(快速幂法)
题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例1输入: 2.00000, 10输出: 1024.00000示例2输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25解题思路:如果nnn为偶数,那可以写成 (x2)n//2(x^2)^{n//2}(x2)n//2如果nnn为奇数,则为x(x2)n/原创 2021-03-03 20:37:30 · 111 阅读 · 1 评论 -
leetcode:剑指Offer15.二进制中1的个数,位运算、移位法
1、题目描述请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例1输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。示例2输入:00000000000000000000000010000000输出:1解释:输入的二原创 2021-03-03 19:38:15 · 88 阅读 · 1 评论 -
leetcode:剑指Offer11.旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。即输入数组是一个递增数组在某个位置上进行了旋转。例如数组[0, 1, 2, 4, 5, 6, 7]可能变为[4, 5, 6, 7, 0, 1, 2]示例1输入:[3,4,5,1,2]输出:1示例2输入:[2,2,2,0,1]输出:0解题方法:1、线原创 2021-03-03 16:30:26 · 85 阅读 · 1 评论 -
leetcode:剑指offer56 数组中数字出现的次数
56-I 数组中找出出现次数为1的数,这种属于位运算题目描述:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例1:输入:nums=[4,1,4,6]输出:[1,6]或[6,1]class Solution(object): def singleNumbers(self, nums): """ :type nums: List[int]原创 2021-03-01 21:20:18 · 119 阅读 · 0 评论 -
leetcode:剑指offer53 在排序数组中查找数字
题目描述统计一个数字在排序数组中出现的次数。示例 1输入: nums = [5,7,7,8,8,10], target = 8输出: 2解题方法二分法ps:python, list.count(a)可以得到数组list里面a出现的次数原创 2021-03-01 21:19:44 · 73 阅读 · 0 评论 -
leetcode:剑指offer52 两个链表的第一个公共节点
题目描述:解题思路:如果把两个链表都遍历一遍,先遍历A,再遍历B和先遍历B再遍历A,遍历次数是一样的。而且如果两个链表后面一样的节点,那么遍历完第一个链表后遍历第二个时,便可以开始做相等比较。代码:# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Noneclass So原创 2021-03-01 15:22:43 · 82 阅读 · 0 评论 -
leetcode 628 三个数的最大乘积
题目给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例输入:nums = [1,2,3]输出:6输入:nums = [1,2,3,4]输出:243<=nums.length<=1043 <= nums.length <= 10^43<=nums.length<=104−1000<=nums[i]<=1000-1000 <= nums[i] <= 1000−1000<=nums[i原创 2021-02-02 21:49:45 · 86 阅读 · 0 评论 -
leetcode:动态规划:53.最大子序和
题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。输入:nums = [0]输出:0假设有数组长度为nnn,下标我们记为000到n−1n-1n−1,最大子序和我们记为fmaxsubf_{maxsub}fmaxsub,那么我们得到:fmaxsub[0]f_{maxsub[0]}fmaxs.原创 2021-02-02 21:12:12 · 128 阅读 · 0 评论 -
leetcode:数组:1467自矩形查询
题目描述请你实现一个类 SubrectangleQueries ,它的构造函数的参数是一个 rows x cols 的矩形(这里用整数矩阵表示),并支持以下两种操作:1. updateSubrectangle(int row1, int col1, int row2, int col2, int newValue)用 newValue 更新以 (row1,col1) 为左上角且以 (row2,col2) 为右下角的子矩形。2. getValue(int row, int col)返回矩形中坐标 (原创 2021-02-01 22:25:35 · 100 阅读 · 0 评论 -
leetcode:数组:简单:主要元素
题目描述数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。示例1输入:[1,2,5,9,5,9,5,5,5]输出:5示例2输入:[3,2]输出:-1示例3输入:[2,2,1,1,1,2,2]输出:2你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗?思路,只要记录下出现的元素已经每个元素出现的次数,次数大于list长度的二分之一,就可以了解法1,用collection来提取元素和每个元素出现的次数impo原创 2021-01-28 19:14:20 · 107 阅读 · 0 评论