算法
文章平均质量分 60
刷题刷题埋头刷题~
thisissally
这个作者很懒,什么都没留下…
展开
-
ACM类编程题笔试
一、行读取的格式# 1、一个input()读取一行# 2、把一行中的数字转化成列表list_1 = list(map(int,input().split())) # 分割-转化成int-list# orlist_1 = [int(i) for i in input().split()]# 3、数字转化成列表 123->[1,2,3]# 无空格的input()输出是数字123,需要转化成列表中的数字:list(map(int,input())# 有空格的input()转化为数值列表l原创 2022-07-07 13:11:43 · 608 阅读 · 0 评论 -
leetcode刷题——回溯例题
文章目录一、组合问题一、组合问题77. 组合:n个数中求k个数的组合问题思路:每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。终止条件:每次搜索到了叶子节点,我们就找到了一个结果。for循环用来横向遍历,递归的过程是纵向遍历。backtracking(递归函数)通过不断调用自己一直往深处遍历,总会遇到叶子节点,遇到了叶子节点就要返回。参数含义:n:相当于树的宽度k:相当于树的深度。startIndex:这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是原创 2021-11-15 15:06:22 · 631 阅读 · 0 评论 -
leetcode刷题——回溯算法知识点
一、什么是回溯?定义:回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。效率:因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。回溯法很难,很不好理解,但是回溯法并不是什么高效的算法。适用情况:一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。适用问题类型组合问题:N个数里面按一定规则找出k个数的集合切割原创 2021-11-15 10:22:42 · 4256 阅读 · 0 评论 -
leetcode刷题——二叉树例题
文章目录一、层序遍历一、层序遍历107. 二叉树的层序遍历 II# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def level原创 2021-11-13 15:26:06 · 4388 阅读 · 2 评论 -
leetcode刷题——二叉树知识点
文章目录一、二叉树的种类二、二叉树的存储方式三、二叉树的遍历方式(一)二叉树的递归遍历四、二叉树的定义一、二叉树的种类满二叉树:只有度为0的结点和度为2的结点完全二叉树:除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。【优先级队列】其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系。二叉搜索树:二叉搜索树是有数值的了,二叉搜索树是一个有序树。若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树原创 2021-11-12 20:45:41 · 426 阅读 · 0 评论 -
leetcode刷题——栈与队列
20. 有效的括号 # 方法一,仅使用栈,更省空间 stack = [] for item in s: if item == '(': stack.append(')') elif item == '[': stack.append(']') elif item == '{': stack.appen原创 2021-11-12 19:43:26 · 3830 阅读 · 0 评论 -
leetcode刷题——字符串
文章目录一、反转二、替换三、翻转一、反转数组反转就用首尾指针,字符串是一种特殊的数组结构344. 反转字符串【反转问题】字符串也是一种数组结构,不同于链表,链表交换是从开始到最后两两交换,相当于调换一下指针的方向;但是字符串的交换则是分别从头尾出发,两两交换头尾元素。class Solution: def reverseString(self, s: List[str]) -> None: """ Do not return anything, m原创 2021-11-12 14:07:33 · 258 阅读 · 0 评论 -
leetcode刷题——循环
特点:边界变换问题解题关键:抓住循环一致性原则,遇到边界每一次的开闭原则都是统一的。54. 螺旋矩阵59. 螺旋矩阵 IIclass Solution: def generateMatrix(self, n: int) -> List[List[int]]: matrix=[[0]*n for _ in range(n)] left,right,up,down=0,n-1,0,n-1 # 可变的边界是这道题的难点,关键在于抓住循环一致性原则每一条.原创 2021-11-10 12:53:32 · 193 阅读 · 0 评论 -
leetcode刷题——查找
一、找一个数是否在元素集合中>>哈希表1. 两数之和题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。类型:无序查找用哈希表思路:01-记录所有数字的索引和值;02-找到num在nums中,target-num也在的情况,同时两者的索引不能相同。经验:(1)for遍历只能针对range或者原创 2021-11-09 20:25:40 · 989 阅读 · 0 评论 -
leetcode刷题——哈希表
认识哈希表数组本质上就是一张哈希表(也称为散列表),哈希表只不过把数组的索引显式表示出来了。所以数组和哈希表查询的时间复杂度都是O(1),一般会用来快速判断一个元素是否在集合中。其添加和删除的时间复杂度是O(n),因为删除或者添加一个元素后面的元素要补上去。与之相对应的是链表,删除和添加的时间复杂度是O(1),查询是O(n),因为最坏的情况是要一直查找到最后一个元素。哈希表的作用统计字符串中所有元素的个数根据唯一索引(分类标志),来存储对应的属于同一组的元素哈希法适用哈希法,一般会选原创 2021-11-09 15:58:37 · 412 阅读 · 0 评论 -
leetcode刷题——链表
206. 反转链表指针法:cur:当前用来遍历的指针pre:要赋值的指针temp:保存原cur指向的位置class Solution: def reverseList(self, head: ListNode) -> ListNode: cur=head pre=None while cur!=None: temp=cur.next # 下一个遍历的位置 cur.next=pre原创 2021-11-07 13:18:55 · 174 阅读 · 0 评论 -
leecode刷题——链表常见操作API
链表的常见操作:获取链表第index个节点的数值链表的最前面插入一个节点在链表的最后面插入一个节点在链表第index个节点前面插入一个节点删除链表的第index个节点# 单链表class Node: def __init__(self, val): self.val = val self.next = Noneclass MyLinkedList: def __init__(self): self._head原创 2021-11-06 23:33:57 · 95 阅读 · 0 评论 -
leetcode刷题——数组和链表
一、数组(一)数组的内存空间连续:数组是存放在连续内存空间上的相同类型数据的集合。数组内存空间的地址是连续的。(二)数组的删除删除需要移动之后元素的位置:正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。数组的元素是不能删的,只能覆盖。也就是用后面的元素覆盖要删除的元素。二、链表(一)链表类型单链表:一个指针域双链表:两个指针域,既可以向前查询也可以向后查询循环链表:链表首尾相连,解决约瑟夫环问题(二)链表的操作1、删原创 2021-11-06 17:24:05 · 126 阅读 · 0 评论 -
leetcode每日一题【Day12】——278. 第一个错误的版本
题目:你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。类型:寻找左侧边界思路:01-左闭右开初始化;02-while终止点、更新条件;03-返回 def firstBadVersion(self, n): #左闭右开 left=0 .原创 2021-09-06 09:52:53 · 73 阅读 · 0 评论 -
leetcode刷题——二分查找
初始化条件,决定搜索区间、while终止点、更新、返回一、最基本的⼆分查找算法因为我们初始化 right = nums.length - 1 所以决定了我们的「搜索区间」是 [left, right] 所以决定了 while (left <= right) 同时也决定了 left = mid+1 和 right = mid-1 因为我们只需找到⼀个 target 的索引即可 所以当 nums[mid] == target 时可以⽴即返回二、寻找左侧边界的⼆分查找因为我们初始化 ri原创 2021-09-06 09:31:52 · 94 阅读 · 0 评论 -
leetcode每日一题【Day11】——11. 盛最多水的容器
题目:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。类型:无序数组找最佳边界思路:01-分别从首尾开始,构造while循环;02-每次更新高度小的索引.原理是:这样才可能找到更大的容积值,并且每次移动都遵照这个原理.经验:(1)双层for循环都可以考虑用双指针代替,涉及子串用滑动窗口,涉及有序或无序边.原创 2021-09-01 09:10:43 · 101 阅读 · 0 评论 -
【首尾指针】leetcode求n数之和
类型:缩减搜索空间,缩短时间复杂度方法:哈希表、首尾双指针题目1:1. 两数之和题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。类型:无序查找用哈希表思路:01-记录所有数字的索引和值;02-找到num在nums中,target-num也在的情况,同时两者的索引不能相同。经验:(1)for遍历.原创 2021-08-24 13:23:54 · 110 阅读 · 0 评论 -
leetcode每日一题【Day7】——26. 删除有序数组中的重复项
类型:快慢指针特点:有序数组的快慢指针题目1:26. 删除有序数组中的重复项题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。参考题解:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/solution/yi-zhao-miao-sha-suo-you-tong-lei-xing-t-ws3g/思路:01-初始化左右指针:.原创 2021-08-23 10:27:48 · 823 阅读 · 0 评论 -
leetcode刷题——双指针
一、适用问题连续子串、连续子数组二、类型固定长度的窗口,用if可变长度的窗口,用while三、思路01- 初始化维护变量、非维护变量、左右窗口02-移动right,更新维护变量03- right不动,更新left,更新维护变量04-输出结果三、常见问题a. 输出结果的位置b. 两端最大<>中间连续最小【Day1]c. 窗口起标记作用,输出结果用到了这个标记【Day6】...原创 2021-08-22 15:18:21 · 119 阅读 · 0 评论 -
leetcode每日一题【Day6】——1052. 爱生气的书店老板
类型:固定窗口特点:维护变量和最终结果不是同一个题目:今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气..原创 2021-08-22 14:35:11 · 123 阅读 · 0 评论 -
leetcode每日一题【Day5】——1004. 最大连续1的个数 III
类型:可变窗口特点:统计元素个数题目:给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。参考题解:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/yi-ge-mo-ban-miao-sha-10dao-zhong-deng-n-sb0x/思路:01-设置维护变量,需要统计..原创 2021-08-21 22:51:26 · 100 阅读 · 0 评论 -
leetcode每日一题【Day4】——438. 找到字符串中所有字母异位词
类型:固定窗口且窗口与外部存在对应性题目:给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指字母相同,但排列不同的字符串。参考题解:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/yi-ge-mo-ban-miao-sha-10dao-zhong-deng-n-sb0x/思路:..原创 2021-08-20 16:34:14 · 82 阅读 · 0 评论 -
leetcode每日一题【Day3】——209. 长度最小的子数组
类型:可变长度的滚动窗口题目:给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度。参考题解:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/yi-ge-mo-ban-miao-sha-10dao-zhong-deng-n-sb0x/思路:可变窗口,(1)遇到不合法窗口时要用while更新直到窗口合法(2)每一次right循环更新都要更新.原创 2021-08-19 11:54:41 · 98 阅读 · 0 评论 -
leetcode每日一题【Day2】——3. 无重复字符的最长子串
类型:可变长度的滚动窗口题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。参考题解:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/yi-ge-mo-ban-miao-sha-10dao-zhong-deng-n-sb0x/思路:可变窗口,(1)遇到不合法窗口时要用while更新直到窗口合法(2)每一次right循环更新都要更新目标经验:(1).原创 2021-08-18 09:52:00 · 68 阅读 · 0 评论 -
leetcode每日一题【Day1】——643. 子数组最大平均数 I
类型:固定长度的滚动窗口题目:给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。参考题解:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/yi-ge-mo-ban-miao-sha-10dao-zhong-deng-n-sb0x/def findMaxAverage(self, nums: List[int], k: int) -> .原创 2021-08-17 20:08:55 · 115 阅读 · 0 评论