算法
再进步一点点
向IT进军
展开
-
笔试算法题
def numberOfArr(a,m,k):#a: list[int], m: int, k: int) -> int: # dp[i][j]表示前i个数字变动j次所有可能次数 n = len(a) dp = [[0] * (k + 1) for _ in range(n)] # 当遍历到a[i]时,其+1最多变动u = min(j,m-a[i])次,-1最多变动v = min(j,a[i]-1)次 # dp[i][j] = sum(dp[i-1][j-t].原创 2021-08-19 15:10:28 · 126 阅读 · 0 评论 -
笔试算法题
# 找数# python多行读取s = []for line in iter(input,""): s.append([int(num) for num in line.split(' ')])T = s[0][0]ans = []for i in range(T): n,k = s[2*i+1][0],s[2*i+1][1] nums = s[2*(i+1)] temp = [0]*n for num in nums: temp[nu..原创 2021-08-10 19:44:56 · 130 阅读 · 0 评论 -
代码笔记——1
LeetCode黄金矿工在一张地图中,可以从任一点出发,只要不出边界,可以向上下左右四个方向移动,每个位置有对应的金块值,每到达一个点会取走对应的黄金,问最后最多能拿到多少黄金,走过的路不可以重走,因为其位置的黄金已经被取走了。def findMaxPath(grid): m, n = len(grid), len(grid[0]) cur = 0 maxpath = 0 def find(i, j): nonlocal cur, maxpath原创 2021-08-09 19:14:41 · 57 阅读 · 0 评论 -
Leetcode---Longest Increasing Subsequence--动态规划
Longest Increasing Subsequence题目链接:Longest Increasing Subsequence思路:最近刷题速度异常的慢,有点崩溃。。。这道题目的难点在于,它的最长上升子序列不要求是连续的。开始看到该题毫无头绪,错误思路有:将数组两边降序的部分进行切除,最后剩余的序列还是包含同样的问题,不连续的序列无法处理。使用动态规划,正确思路是:定义一个dp[...原创 2018-12-28 14:47:36 · 205 阅读 · 1 评论 -
Leetcode---合并区间--利用Comparator
合并区间题目链接:合并区间思路:这道题乍一看没什么头绪,不知从何下手,先看两个区间的合并,例如[1,3]和[2,6],怎么判断是否可以合并呢?当时我想的是,2在[1,3]之间,那么就可以合并,那么也就是下一个区间的start在当前区间的范围内就可以合并,但是如果颠倒了呢?显然就不正确了,即[2,6],[1,3],此时1不在[2,6]内。那么这里发现的归律就是要先对区间的start排序,然...原创 2018-12-11 12:53:44 · 163 阅读 · 0 评论 -
Leetcode---搜索二维矩阵 II--O(m+n)
搜索二维矩阵 II题目链接:搜索二维矩阵 II思路:由于四级考试耽搁了两天更新,继续坚持。本题给出的矩阵有横向数字增大,纵向数字增大的特征,那么根据这个特征去寻找最佳答案。我觉得还是很难想到的,我们从第一行的最右边数字进行搜索,如果相等则return true,若target大于该数字,则舍弃比该数小的数字,即可以舍掉当前所在的行,如果小于该数字,则舍掉该数所在的列具体的舍弃行列操作...原创 2018-12-17 10:42:09 · 177 阅读 · 0 评论 -
Leetcde---零钱兑换--动态规划
零钱兑换题目链接:零钱兑换思路:这题是一个背包问题,不同的是,没有给出包的容量限制,利用题目中的例子,给定硬币coins = {1,2,5},目标值val = 11,可以转化为求11-1,11-2,11-5,三种所需硬币最少的数量+1,深入分解,当所求值为1,2,5时,所需硬币数量为1可以定义一个dp[],容量为val+1,存储val为下标值时,所需的最少硬币数量,这样定义数组的缺点是数...原创 2018-12-27 13:55:35 · 237 阅读 · 0 评论 -
Leetcode---不同路径--动态规划
不同路径题目链接:不同路径思路:求解机器人从左上角到右下角有多少条路径,动态规划思路是求解和原问题类似的子问题的解,那么我们发现由于每次只能往右或者往下,那么到终点的路径就可以分解为到终点上面一个格子的总路径数+到终点左边一个格子数的总路径的和继续拆解子问题,拆到不可再分就是起点到上边缘无论哪个格子,路径只有一条,左边缘也是一样那么此时可以定义一个二维dp数组进行遍历,数组存放到每个相...原创 2018-12-27 10:50:16 · 134 阅读 · 0 评论 -
Leetcode---在排序数组中查找元素的第一个和最后一个位置--递归
在排序数组中查找元素的第一个和最后一个位置题目链接:在排序数组中查找元素的第一个和最后一个位置思路:本题就是二分搜索的变形,二分搜索是找到一个数组中存在的目标数值的下标,这里是寻找目标数值的起始和终点位置处理方法只需要稍加改变,找到mid下标该位置值小于目标则舍弃左段若大于则舍弃右段等于时:左右两断都要寻找,分别找到左段中起始,和右段中的终点位置,合在一起作为整个数组的返回值,这里...原创 2018-12-10 10:14:34 · 178 阅读 · 0 评论 -
Leetcode---跳跃游戏--贪婪
跳跃游戏题目链接:跳跃游戏思路:利用动态规划的思路:定义一个dp数组,存放每个对应的位置所能抵达的最远下标值,递归式为:dp[i] = max{dp[i-1],i+nums[i]},如果当前下标大于dp[i-1],说明当前下标是达不到的位置,故直接return false对上述数组转化为一个int型数,即变为贪婪,上述dp数组我们发现仅仅用到前一个数就可以得到更新,所以可以不定义数组,那...原创 2018-12-20 15:46:35 · 124 阅读 · 0 评论 -
Leetcode---二叉树的序列化与反序列化--递归
二叉树的序列化与反序列化题目链接:二叉树的序列化与反序列化思路:这道题。。。真是让我处理了很久啊。我的第一思路有两个,1.二叉树的层次遍历,再反序列化构造,这里就要求将二叉树当做完全二叉树遍历,空节点用“#”代替。第二个就是下面的错误思路。。。错误思路:我记得之前刷过一题,二叉树先序和中序重造二叉树,那么在序列化时,我准备采用将二叉树先序遍历和中序遍历的结果放在一个字符串里,然后序列化...原创 2018-12-29 16:16:28 · 608 阅读 · 1 评论 -
Leetcode---Insert Delete GetRandom O(1)--两种解
Insert Delete GetRandom O(1)题目链接:Insert Delete GetRandom O(1)思路:本题和JAVA中的set集合中的插入删除极为相似,所以最简便的方法是使用set集合进行模拟,插入删除不用修改,在返回随机数时,由于set集合不能够返回指定位置的值,所以要对其进行转换,可以将set集合转换为ArrayList,然后再返回随机位置的值。这种方法的缺...原创 2018-12-30 15:39:20 · 181 阅读 · 0 评论 -
Leetcode---快乐数--技巧
快乐数题目链接:快乐数思路:这道题乍一看不知道怎么解,了解什么是快乐数后非常简单突破点就两个:1.如何拆解任意长度的整数 2.如何判断非快乐数已经进入循环状态第一个直接循环拆就行了,第二个在百度了快乐数后了解,所有非快乐数最终都会进入4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。代码: public static boolean isH...原创 2018-12-31 12:24:24 · 311 阅读 · 0 评论 -
Leetcode---阶乘后的零
阶乘后的零题目链接:阶乘后的零这一题用求阶乘的方法必然溢出需要探索数学技巧,我其实没有真正弄明白,技巧非常简单,求尾数中0的个数,只需求0——n中含有5这个因子的数的个数,特别的像:25,50这样的数要视为含有两个5,25=55,50=25*5代码:public int trailingZeroes(int n) { int result = 0; while(n!=0) { ...原创 2018-12-31 14:28:46 · 146 阅读 · 0 评论 -
Leetcode---逆波兰表达式求值--栈
逆波兰表达式求值题目链接:添加链接描述思路:逆波兰式是典型的运用栈结构进行运算的不仅仅此处使用栈结构求解,包括构造一个逆波兰式也是使用栈结构构成的,对于构造逆波兰式,此处不做多余的说明整个流程很简单,遍历整个string数组,碰到的是数字就入栈,碰到的是字符,就出栈两个数作为操作数进行运算,这里需要注意两个数字的操作次序,比如0/3不要写成3/0最终遍历完整个数组,栈当中也必然只含有一...原创 2019-01-04 22:30:52 · 175 阅读 · 0 评论 -
Leetcode---两数相除--循环+移位
两数相除题目链接:两数相除思路:不能通过除法运算首先我的第一思路是通过将两数转化为绝对值形式,符号位单独判断,数值位通过循环相减来计算但是在写完程序提交时发现这种运行速度太慢了,超时转变思路,通过每次寻找将除数扩大2^n倍(即将除数左移n位),找到最接近被除数的值,商相应的由1–>2 ^n,再将被除数减掉除数,得到余数继续作为被除数循环注意这里的运算都是先转换为long型进行...原创 2019-01-01 19:44:19 · 309 阅读 · 0 评论 -
Leetcode---分数到小数
分数到小数题目链接:分数到小数思路:网上对于这道题的解答,思路上大同小异1.首先符号位单独拿出来判断2.整数部分单独计算(通过判断是否能整除)3.整除则可以返回结果了,不能整数则追加“.”4.小数部分通过循环来计算,只要余数不为0,就通过扩大十倍再与除数相除,这里需要通过一个Map来记录余数,因为循环小数的特征是出现余数相同的结果,当碰到存储过得余数时说明产生循环了,在那个位置添加一...原创 2019-01-02 21:34:02 · 760 阅读 · 1 评论 -
Leetcode---两整数之和--不用加减
两整数之和题目链接:两整数之和这道题出的其实意义不大,既然限制了使用加减直接运算,那是否限制整个运算过程中不可出现加减呢?如果限制,那基本上是实现不了的,当然,调用java自身的库函数除外这里我给出的解答,没有直接使用加减运算,而是使用“异或”和“与”运算,整个运算过程中使用了自增运算思路:限制直接使用加减,只能通过与运算解决,分析:如0101B+0110B使用位运算,那么就要每一位单...原创 2019-01-03 13:22:44 · 461 阅读 · 0 评论 -
Leetcode---求众数+Task Scheduler
求众数+Task Scheduler题目一链接:求众数分析:这道题很简单,题目已经表明众数是字符个数超过n/2的数,那么可以直接使用排序,取n/2处的值,返回即可这里我使用的是map,对每个字符进行统计个数,并记录其中出现次数最多的返回 public static int majorityElement(int[] nums) { Map<Integer, Integer&g...原创 2019-01-09 18:36:33 · 125 阅读 · 0 评论 -
Leetcode---寻找峰值--遍历和二分
寻找峰值题目链接:寻找峰值思路:这道题的题目有点没讲明白,比如一个数组为{1,5,2,3,4}那么这里5是峰值,4属于峰值吗?第一个解法就是直接遍历,遍历1——nums.length-2之间的数是否为峰值,没有峰值则返回max{nums[0],nums[nums.length-1]},相当于利用峰值的定义 public int findPeakElement(int[] nums) ...原创 2018-12-09 12:00:02 · 810 阅读 · 0 评论 -
Leetcode---颜色分类--计数排序
颜色分类题目链接:颜色分类思路:本题利用计数排序非常简单,仅需要定义一个长度为3的一维数组利用数组存储每一种颜色出现的数量,再通过该数组对原数组进行重排重排时仅需要将定义的数组的下标赋值给原数组即可本题下面给出的进阶要求没有读明白:你能想出一个仅使用常数空间的一趟扫描算法吗?难道3种颜色不算是常数空间的数组吗?有大神路过还请赐教public void sortColors(int...原创 2018-12-06 21:44:11 · 623 阅读 · 0 评论 -
Leetcode---括号生成--回溯
括号生成题目链接:括号生成思路:回溯法的结果集一般是搜索过程中动态生成的利用条件限制不合法的子集生成,避免庞大的无效递归当结果不满足条件时返回到上一层,应当恢复为之前的状态这里两个存储空间,所以互不影响public List<String> generateParenthesis(int n) { //构造一个结果集 List<String> li...原创 2018-12-03 21:03:00 · 252 阅读 · 0 评论 -
Leetcode---二叉搜索树中第K小的元素--递归
二叉搜索树中第K小的元素题目链接:二叉搜索树中第K小的元素思路:中序遍历一个二叉搜索树,得到的是一个有序序列根据这个原理,我们使用递归遍历,仅需要找到第K次弹栈的元素即可代码: int count = 0; int val = 0; public int kthSmallest(TreeNode root, int k) { kthSmallest1(root,k); ...原创 2018-11-30 15:36:29 · 255 阅读 · 0 评论 -
Leetcode---每个节点的右向指针--递归解法(两种)
本文接上一篇文章:非递归方法解法一:先将根节点的next置为null,再分别处理左右孩子左右孩子采用递归的方式这里的递归不是最优的,递归过程中产生了重复,而必须这样写目的是处理left->right和right->left,经过分析,除最外侧的节点之外,均产生了重复的递归 public void connect(TreeLinkNode root) { //递归算法连...原创 2018-11-30 13:54:10 · 172 阅读 · 0 评论 -
Leetcode---每个节点的右向指针--非递归解法
每个节点的右向指针该题用递归解法相比较代码更简洁题目链接:每个节点的右向指针思路:这里的思路和我前面写的层次遍历二叉树的文章基本相同,可以参考之前的思路。public void connect(TreeLinkNode root) { if(root==null) { return; } //对该二叉树进行层次遍历 //需要一个队列 LinkedL...原创 2018-11-29 14:29:15 · 105 阅读 · 0 评论 -
Leetcode---电话号码的字母组合--回溯
电话号码的字母组合题目链接:电话号码的字母组合分析:第一次接触回溯的题目,没有什么头绪,题目看似简单,本以为简单的多重for循环即可搞定,仔细思考发现各种问题首先digits.length是可变的,那么对于digits的每一位数字,我们都需要到另一个字符串数组中查询可选字符,所以,我们需要digits.length重循环语句,简单的for循环的嵌套,是处理不了的,而深度递归可以。没有达...原创 2018-12-02 11:54:28 · 281 阅读 · 0 评论 -
Leetcode---相交链表--两种解法
相交链表题目地址:相交链表解法一利用set集合存储a链表的地址,再遍历b链表每个节点,碰到相等的就返回public ListNode getIntersectionNode(ListNode headA, ListNode headB) { //解法一: if(headA==null||headB==null) { return null; } Set<L...原创 2018-11-25 18:09:29 · 465 阅读 · 0 评论 -
Leetcode---奇偶链表---时间复O(n)&空间O(1)算法
奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例1:输入: 1->2->3->4->5->NULL输出: 1->3->5-&...原创 2018-11-24 16:03:12 · 285 阅读 · 0 评论 -
Leetcode---递增的三元子序列---两种解法
递增的三元子序列给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。数学表达式如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1, 使得 arr[i] < arr[j] < arr[k],返回 true ; 否则返回 false 。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。思路...原创 2018-11-22 14:20:53 · 633 阅读 · 0 评论 -
Leetcode---两数相加--直观解法(链表)
两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -...原创 2018-11-23 16:43:05 · 159 阅读 · 0 评论 -
Leetcode---中序遍历二叉树--递归和非递归
中序遍历二叉树题目链接:中序遍历二叉树解法一:递归遍历比较简单public List&lt;Integer&gt; inorderTraversal(TreeNode root) { List&lt;Integer&gt; result = new ArrayList&lt;Integer&gt;(); inorderTraversal(root,result); return.原创 2018-11-27 16:55:13 · 211 阅读 · 0 评论 -
Leetcode---二叉树的锯齿形层次遍历--思路
二叉树的锯齿形层次遍历题目链接:二叉树的锯齿形层次遍历解题思路:思路上和普通层次遍历没有什么区别,就多了一个偶数层翻转集合顺序深度遍历使用辅助栈结构,层次遍历使用辅助队列结构,java当中List结构也可以作为队列使用通过两个数分别记录当前层和下一层的节点数一个List结构记录每一层的节点,需要翻转时将其反转一个List结构用作辅助队列,起初将root入队利用队列判断循环结束,当...原创 2018-11-27 17:13:19 · 144 阅读 · 0 评论 -
Leetcode---单词搜索--回溯
单词搜索题目链接:单词搜索分析:首先我们需要找到和单词中首字母匹配的下标值,从该点出发,向四周扩散,递归搜索下一个和第二个字母匹配的值,以此类推……回溯剪枝:如果下标越界、值不匹配、或者该下标已经遍历过,那么直接return这里需要定义一个辅助数组来存储该下标的值是否遍历过遍历该值时将该值的辅助数组改为true代表遍历过了,在调用完四个递归后,应当将该true再置为false,否则影...原创 2018-12-05 21:34:04 · 186 阅读 · 0 评论 -
Leetcode---搜索旋转排序数组--O(logn)
搜索旋转排序数组题目链接:搜索旋转排序数组思路:该题目是二叉搜索的变形,变化就是,将一个有序数组,从一个未知节点折断放到末尾这里处理方式还是相同的,找到mid位置,判断该数是否与目标值相同,如果相同return不同就与当前范围的第一个数比较,如果不小于,则说明该数前面的数字是有序的,再判断target是否在该范围内,不在就转到后面如果小于,则说明前面的数中,包含折断位置,那么该数后面...原创 2018-12-12 15:06:22 · 191 阅读 · 0 评论 -
Leetcode---数组中的第K个最大元素--随机化算法
数组中的第K个最大元素题目链接:数组中的第K个最大元素思路:如果先排序,不管利用哪个,比较排序时间复杂度最优为O(nlgn)但是我们发现,快排的一趟排列有一定的性质,我们可以求得一趟快排之后,该数在整个数组中排在第几位,且将整个数组划分为两段利用这个性质,我们可以单侧截断,递归查找第K个最大元素但是这个算法并不是最优的,因为他和数组的原始状况有关,原始数组最坏为逆序状态下,算法复杂度...原创 2018-12-08 12:29:30 · 619 阅读 · 0 评论 -
Leetcode---子集--回溯
子集题目链接:子集思路:对于集合中的每一个数字,都有两种选择:选它,选空(什么都不选)遍历完整个集合,则找到了所有子集这里可以选择两种方式:1.循环遍历集合,添加为空由删除控制2.添加为空,直接递归且将第一个数字剔除,这里我选择第二种,所以不需要循环 public List<List<Integer>> subsets(int[] nums) { L...原创 2018-12-05 13:40:03 · 158 阅读 · 0 评论 -
Leetcode---前K个高频元素--O(n)复杂度
前K个高频元素题目链接:前K个高频元素思路:解法一:首先对整个数组排序,复杂度O(nlgn)再对每个数字出现的频度排序最后找出前K个数字解法二:将数组遍历存入map集合中,value值存放出现次数构造一个长度为nums.length+1的lists数组将频度作为下标添加至lists[i]集合中最后按标从大到小遍历,获取集合中的值,添加至结果集,加入k个即可 public...原创 2018-12-07 19:34:28 · 156 阅读 · 0 评论 -
Leetcode---全排列--回溯
全排列题目链接:全排列思路:这道题做起来感觉比前面两篇文章的题目还要简单 ^ - ^首先数字的个数我们不清楚,只能使用回溯法逐渐递归第一次有n种选择,第二次又n-1中……直到仅有一种可选结束回溯过程中传递到下一层时仅需要将当前添加的数字从数组中剔除即可由于数组剔除一个数字比较麻烦,在一开始,我使用List集合复制了数组当递归达到层数后,将集合添加进结果集时,又需要注意,要重新定义...原创 2018-12-05 10:50:19 · 190 阅读 · 0 评论 -
Leetcode---岛屿的个数--递归
岛屿的个数题目链接:岛屿的个数思路:本题就是简单的连通图个数问题只需要找出所有连通图的个数,当一个点为:1时,只需递归扩散到周围四个点,再额外定义一个visit数组记录遍历过的节点当一个连通图遍历完全时,再继续寻找下一个连通图,进行计数代码: public int numIslands(char[][] grid) { if(grid==null||grid.length==...原创 2018-12-01 20:53:38 · 203 阅读 · 0 评论 -
Leetcode---从前序与中序遍历序列构造二叉树--思路
从前序与中序遍历序列构造二叉树题目链接:从前序与中序遍历序列构造二叉树解题思路:从遍历序列构造二叉树时,必须包含有中序遍历,先序和后序是构造不了的方法:首先找先序的第一个节点,它一定是树的根节点,然后在中序序列中找到该节点的位置,左边即为该节点的左子树遍历序列,右边则为右子树遍历序列再去构造子树时,我们发现典型的递归构造那么构造单独一个节点时,我们需要的是什么?只需要当前遍历的先序序...原创 2018-11-28 16:23:05 · 124 阅读 · 0 评论