leetcode-everyday
力扣每天一道算法题
带着希望活下去
这个作者很懒,什么都没留下…
展开
-
lt-week-声网-03-解决智力问题
题目:解决治理问题思路:这道题看完之后,想到了 从一个节点跳到另外一个节点,就把他想成了深度求数值(dfs实际上求深度有解,而不适用于求极值),求极值贪心和动态规划,实际上这道题是一个动态规划的题;写完dfs时间超时,实际上会处理很多重复位置的值;动态规划的必备三个条件:重复子问题,最优子结构,状态转移方程通过动态规划我们可以知道:动态规划先1. 需要DP数组存储状态:2.通过当前状态所依赖的状态,来计算当前状态。本题能够知道 在 f(i)处 我们只有两个操作:(1)原创 2022-01-18 16:24:29 · 214 阅读 · 0 评论 -
29-lt-不同路径
62.不同路径思路:当看到路径的时候就总是想着使用DFS去解决问题,最终信心满满的超时;看完题解恍然大悟动态规划最经典,继续加油再接再厉。困难:可能是自己还是不能真正理解 不能够举一反三,希望能够再接再厉结果:dfs会超时:dfs为什么会超时,以为会重复的去计算相关的路径使用动态规划:public int uniquePaths(int m, int n) { //DFS + 回溯 求得所有的路径 需要加 visited 不能走走过的路径 直原创 2021-12-28 17:19:53 · 204 阅读 · 0 评论 -
28-lt-旋转图像
48.旋转图像思路:1. 一开始看到题目的时候,能够想到的是 找到对应的数学函数公式,发现太久了哈哈,最后发现有点类似之前数据的翻转题目,(x,y)->(x+2,y-4)等等。。就是分步骤进行操作结果就是可以通过先上下 y = 1/2y来进行折叠再通过y = 1/2x对称可以得到90度翻转,实际上也就是先180度翻转最后在除以2就是90度翻转难点:关键要能想到数学的矩阵的关系结果:class Solution { public void..原创 2021-12-28 14:34:47 · 431 阅读 · 0 评论 -
27-lt-下一个排列
一 思路1. 首先这道题的题意都没弄明白,没能够读懂题意;看评论才知道原来是干什么的;就是进行一个数组内,求出下一个比其大的排列 例如: [1,2,3] 比他大的是 [1,3,2] [2,1,3] [2,3,1] [3,1,2] [3,2,1]然后要求是尽可能小 只能位[1,3,2]所以,可以看成为是 从尾部找到相邻的递增区域,然后进行和区域内第一个大于递增位置交换,最后进行递增遍历区域内数组二 问题难点关键是要明白题目中的含义,加上各个数组内的反转情况。三 结果...原创 2021-12-14 13:51:07 · 627 阅读 · 0 评论 -
26-lt-三数之和
一 思路看到本题的思路就是 排序+三重循环 进行求出所有存在的解明显时间复杂度 为O(n^3) 最终超时;思考过后能够知道 ,之前做过两数之和,实际上可以将第一次循环的值作为后面两数之和的target;是滴 这种可解二 难点注意循环操作 进行处理重复值的问题三 结果class Solution { public List<List<Integer>> threeSum(int[] nums) {原创 2021-12-09 11:01:23 · 74 阅读 · 0 评论 -
24-lt-剪绳子问题
剪绳子问题最大的感受是 对于数学能力考察要求很高,可以进行数学的推导公式直接求出最大临界点的数值。 3 是一个比较特殊的数字点,因此将数字进行分解出更可能多的3数值一思路直接 分解出更多的3n/3 得到的a指数 n%3得到b余数根据余数b的值 进行判断 结果运算表达式:b==0 3^n b==1 (比较特殊 如果是1的话可以补充一个3 换为2*2) 3^n-1 * 4 b==2 直接进行 3^n * 2二 问题点进行规律查询 能够得到 3 是比较特殊的点...原创 2021-12-02 11:52:38 · 76 阅读 · 0 评论 -
25-lt-相对名次
相对名次一思路easy题,没什么技巧,直接进行借助map确定排列顺序二问题三结果public static String[] findRelativeRanks(int[] score) { Map<Integer, String> map = new HashMap<Integer, String>(); //深拷贝浅拷贝类型 引用类型都会指向相对应的地址 int[] temp = score.cl原创 2021-12-02 11:37:41 · 60 阅读 · 0 评论 -
23-lt-二进制中的1的个数
主要考察的位运算,基础知识薄弱 需加强记忆做这道题的前提,首先进行熟悉一下我们的位运算:位运算概念剑指 Offer 15. 二进制中1的个数public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { //1. 直接进行按位 &的循环遍历比较 // int res = 0;原创 2021-12-01 13:36:19 · 82 阅读 · 0 评论 -
22-lt-重建二叉树
剑指offer07.重建二叉树一 思路看到二叉树首先想到遍历操作 BFS DFS;由前序和中序重建二叉树,首先想到的是 root根节点,前序第一个便是root根节点,根据root找到 中序位置,能够得到左右子树,可以根据左右子树依次进行遍历。二 难点怎么选择重建二叉树操作? 左右子树节点位置的考虑分析三 结果/** * Definition for a binary tree node. * public class TreeNode { * int原创 2021-11-30 13:22:11 · 550 阅读 · 0 评论 -
21-lt-岛屿数量
200.岛屿数量岛屿数量是比较常见的,也会经常进行出其他变种题,如病毒扩散题,都是用DFS进行求解最直接,按道理来说能够使用DFS求解的往往都能够使用BFS进行求解。一、思路直接进行选择使用DFS进行求解,只要是进行求极值的往往都会使用到DFS和BFS操作二、遇到难题base caseDFS实际上就是递归操作,我们需要进行找到返回条件即可,主要使用的是将岛屿的位置变为其他,进行操作统计数量。三、结果DFS:class Solution { .原创 2021-11-29 22:45:03 · 180 阅读 · 0 评论 -
20-lt-N叉树最大深度
最近忙于从上海搬到北京实习,少刷了好多天的算法,选择大数据方向,希望自己能够坚持不懈,有所成就。559.N叉树的最大深度一、思路看到二叉树最大深度就是进行遍历操作,首先选择使用的便是二叉树的深度遍历的变形,(二叉树的深度遍历还是选择前序遍历最好)N叉树是同样的规则;本题目能使用BFS、DFS的操作二、难点根据二叉树最大深度进行操作即可三、结果DFS:/*// Definition for a Node.class Node { public int va原创 2021-11-28 23:46:19 · 92 阅读 · 0 评论 -
19-lt-最小和谐子数列
594. 最长和谐子序列1. 思路这虽然是一道简单题,但是看完题目,求数组间的差值的最长数列,首先就能够想到双指针,利用双指针进行统计。2.问题思路难点对于排序完之后的数组,进行双指针的1. 双指针使用 类似滑动窗口的操作2. 双指针的结果值返回3.结果利用class Solution { public int findLHS(int[] nums) { //先进行排序操作 Arrays.sort(nums);..原创 2021-11-20 10:22:04 · 590 阅读 · 0 评论 -
18-lt-整数替换
397.整数替换1. 思路思路很简单,进行求奇偶数变为1的最小次数,首先能够想到DFS;递归操作,递归很容易就能想出来:首先最基本的1.条件返回值 if(n == 1)2.然后就是偶数一直递归值条件返回值3.进行次数累计2.遇到难点没考虑到整数型溢出问题 整数最大值为 2147483647 ,但是如果记性基数的+1操作会致使整数型数据溢出,因此需要进行消除溢出情况。在进行奇数的操作的时候 可以直接 n/2 + 1 和 n/2操作3.结果class So...原创 2021-11-19 20:21:32 · 59 阅读 · 0 评论 -
17-lt-栈---实现各种栈
1. 栈的实现栈的实现可以使用队列进行class MyStack { private List<Integer> data; // store elements public MyStack() { data = new ArrayList<>(); } /** Insert an element into the stack. */ public void push(int x) {原创 2021-11-18 14:09:59 · 89 阅读 · 0 评论 -
16-lt-矩阵中的路径
剑指 Offer 12. 矩阵中的路径思路:看到此题首先想到的就是1. DFS2.base case 上下左右都可以进行移动 并且记录走过的位置3. 经测试用例发现--遍历数组中所有的值依次DFS操作遇到难点:代码跑通95%,剩下的调试发现,在进行记录位置的时候,出现了异常,应该在进行回溯的时候,将不满足的位置重新置位false解决:class Solution { public boolean exist(char[][] board, Stri.原创 2021-11-17 09:49:12 · 63 阅读 · 0 评论 -
17-lt-路径最大和
112. 路径总和思路:对于二叉树的一条合适路径的选择,直接使用DFS,但是这道题在调试的时候还是遇到了小麻烦,注意点:1. base case 的中断条件是 左右子节点都为空,叶子结点返回2. 值进行和目标值对比遇到的难点:没分析清楚叶子节点 ,直接 root == null进行了比较;叶子结点是重要点结果:/** * Definition for a binary tree node. * public class TreeNode { *原创 2021-11-15 22:40:56 · 194 阅读 · 0 评论 -
16-lt-对称二叉树
101.对称二叉树思路:对于二叉树的操作,一般都是二叉树遍历的操作,此处求得对称二叉树,上来首先想到的是对称二叉树,但是写出来之后,对于null处理不好处理,进行了null值处理之后,仍然不行;忘记了观察规律,二叉树的对称树,实际上就是左子树和右子树的一个比较。遇到问题:思路想歪了,只停留在算法层面上,忘记考虑真实的解题思路。结果:/** * Definition for a binary tree node. * public class TreeNode {.原创 2021-11-15 21:50:08 · 196 阅读 · 0 评论 -
16-lt-链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点思路:这道题很简单,自己首先想到的就是两次循环,一次得到所有的数据,一次获取指定位置;时间复杂度:O(n)空间复杂度:O(2)遇到难点:A是能A掉,但是空间复杂度过高;可以想到更优的解法结果:自己第一个思路想到的/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode n原创 2021-11-15 13:40:48 · 189 阅读 · 0 评论 -
15-lt-机器人的运动范围
class Solution { public int movingCount(int m, int n, int k) { boolean[][] visited = new boolean[m][n]; int res = 0; //创建队列 Queue<int[]> queue = new LinkedList<int[]>(); queue.add(new int[...原创 2021-11-13 18:27:22 · 4738 阅读 · 0 评论 -
16-lt-检测大小写字母
520.检测大小写字母直接根据base case进行循环遍历求所不满足的条件,很简单的一道题。class Solution { public boolean detectCapitalUse(String word) { //base case three status //one all word is large //two all word is small //three different the first mu原创 2021-11-13 18:01:57 · 153 阅读 · 0 评论 -
15-lt-最小路径和
64. 最小路径和刚开始以为首先想到的是 求最短路径用BFS进行操作 但是BFS是对于二叉树或者图容易求最短路径,相对于二维数组求最短路径,可转换为求极值,所以会用到DP,关于DP要清楚的是:明确 base case -> 明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义。1. base case明确知道 当前位置只能从我的左边位置和上方位置过来,边界位置的处理以i为row j为column,可以知道1. i == 0 && j..原创 2021-11-12 10:47:39 · 358 阅读 · 0 评论 -
二叉树最大深度的情况讨论
对于二叉树我们可以都熟悉:二叉树遍历、BFS、DFSBFS和DFS参考https://leetcode-cn.com/leetbook/read/data-structure-binary-tree/xoh1zg/1.递归二叉树最大深度递归2 BFSBFS的实现原理就是一层层遍历,统计一下总共有多少层,我们来画个图分析一下。代码如下 public int maxDepth(TreeNode root) { if (root == null) ...原创 2021-11-12 10:31:22 · 216 阅读 · 0 评论 -
lt-14-二叉树的最大深度
二叉树最大深度文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言二叉树:树 是一种经常用到的数据结构,用来模拟具有树状结构性质的数据集合。树里的每一个节点有一个值和一个包含所有子节点的列表。从图的观点来看,树也可视为一个拥有N 个节点和N-1 条边的一个有向无环图。二叉树是一种更为典型的树状结构。如它名字所描述的那样,二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”。一、二叉树遍原创 2021-11-11 23:40:21 · 285 阅读 · 0 评论 -
14-lt-数组重叠合并问题
495.提莫攻击进行计算中毒状态class Solution { public int findPoisonedDuration(int[] timeSeries, int duration) { // //合并区间 区间合并 进行操作 // //找出所有的数据 利用非递减 // if (timeSeries.length == 0) { // return 0; // } // in原创 2021-11-11 14:17:05 · 344 阅读 · 0 评论 -
14-lt-旋转数组最小数字
今天的题真的是考察最基本的二分法变形,自己第一时间没想出来,直接O(n)A掉了,没进行思考,对于已排好序的数组查找某一个值,通常需要考虑到二分法。看完下面的就可以A掉类似的题:153. 寻找旋转排序数组中的最小值(中等)154. 寻找旋转排序数组中的最小值 II(困难)先回顾一下二分法吧;704.二分查找class Solution { public int search(int[] nums, int target) { //判断条件 in原创 2021-11-09 00:25:02 · 3589 阅读 · 0 评论 -
13-lt-斐波那契数列
剑指 Offer 10- I. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0,F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2...原创 2021-11-07 17:50:56 · 132 阅读 · 0 评论 -
13-lt-数组中重复的数字
剑指 Offer 03. 数组中重复的数字class Solution { public int findRepeatNumber(int[] nums) { //1.利用map直接找出来或者set // Map<Integer,Integer> map = new HashMap<>(); // for(int i = 0; i < nums.length; i++){ // //进行判原创 2021-11-07 16:57:02 · 66 阅读 · 0 评论 -
12-lt-丢失数字(用异或)
268. 丢失的数字1.找出丢失数字,也就是在数组内出现过的数字最开始字节进行借助 list或者map操作 ,两边数组循环找出未出现的数字,显然时间运行复杂度高异或的操作明显更好异或为 只有一个为真的时候结果才为真;相同为0,相异为真例如:a^a= 0所以就能够想到使用异或进行处理class Solution { public int missingNumber(int[] nums) { int res = nums.length; f..原创 2021-11-06 11:07:57 · 139 阅读 · 0 评论 -
12-lt-删除链表中的值
237.删除链表中的指定节点题目不能够直接访问head,直接删除指定节点;可以将节点值直接进行抹除。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public void deleteNode(.原创 2021-11-05 16:11:00 · 64 阅读 · 0 评论 -
10-lt-二叉树的遍历
今天刚做了二叉树的前序遍历在这里总结一下二叉树遍历,利用递归解法。144.二叉树的前序遍历94.中序遍历145.二叉树后序遍历递归思想打掉二叉树遍历操作:前序遍历/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * Tr原创 2021-11-04 21:28:53 · 68 阅读 · 0 评论 -
11-lt-有效的完全平方数
看到平方数,不让使用内置函数,首先想到使用二分查找,找到对应的 mid*mid = num值367.有效完全平方数class Solution { public boolean isPerfectSquare(int num) { //折半查找进行判断 分为奇偶数进行查询 int left = 0, right = num; while (left <= right) { //中心位置原创 2021-11-04 20:15:28 · 86 阅读 · 0 评论 -
10-lt-二叉树的中序遍历
二叉树的中序遍历:规则:左-根-右 依次遍历即可一 递归遍历首先想到的便是递归调用(对于求深度的搜索遍历的这种类型,找出条件返回点,往往递归是比较好想到的)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(i.原创 2021-11-04 09:38:07 · 105 阅读 · 0 评论 -
9-leetcode topN问题
今天做到了合并元素,使用了优先队列,有点小题大做,但是还是想总结一下,优先队列处理topN问题的好处。347.前k个高频元素215. 数组中的第K个最大元素前k个高频元素给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。使用优先队列快速A掉,总共花费四分钟,虽然用时看起来吓人public static int[] topKFrequent(int[] nums, int k) { //优先队列解决t...原创 2021-11-02 23:17:58 · 3318 阅读 · 0 评论 -
9-leetcode 合并两个有序数组
88.合并两个有序数组对于合并有序(无序)数组或者链表,最终返回一个有序的数组或者链表的方式,我优先会想到的是优先队列(优先队列的底层实现是大小根堆)值的注意的是 当遇到求TOPN的那种例子的时候,优先队列更好用,对于K个数组或者不管什么样的,只要是进行合并最终排序,最快速的解法就是优先队列 时间复杂度最多为 m+n 或者是 K个队列 一遍遍历就ok。可以尝试TOPN相关的使用优先队列首先这道题我使用的就是优先队列给A掉;思路简单,但是明显的话没用到题目的有序性class S.原创 2021-11-02 21:53:16 · 181 阅读 · 0 评论 -
8-leetcode-删除链表内重复的数据
83 删除排序链表内的重复数据83 删除排序链表中重复的数据思路:判断排序链表中的数据重复,主要就是 当前节点值和下一个节点值如果相等,就跳过下一个节点值;如果不相等则直接指向当前节点指向下一个节点if(cur == cur.next){cur.next = cur.next.next;}else{cur = cur.next;}但是一开始想的就是利用临时链表,没有进行深入思考/** * Definition for singly-linked list. * p.原创 2021-11-02 10:00:26 · 86 阅读 · 0 评论 -
7-leetcode-最后一个单词的长度
题目:最后一个单词的长度public int lengthOfLastWord(String s) { int length = 0; // 注意从后面进行取出空格 统计出现的最后一个单词长度 for(int i = s.length() - 1;i >= 0;i--){ if(s.charAt(i) != ' '){ length++; }else if(len原创 2021-10-31 23:08:35 · 413 阅读 · 0 评论 -
7-leetcode最大子序列和
leetcode 最大子序列和:最大子序列和首先想到的就是最大子序列和 ,题目只要求最初最大子序列的和,能够想到的是还能变为求最大子序列实际上能够想到的最简单的就是求最大子序列和,就是最大值,负值直接跳过,保持最大值就可以,不由就能想到 num[i] < 0 的都可以去掉 也就是 num[i] + num[i+1] 和 num[i+1]做比较 取最大值;因此我们能够想到 动态规划转移方程: f(i) = MAX(f(i-1)+nums[i],nums[i])class...原创 2021-10-31 18:20:47 · 178 阅读 · 0 评论 -
4.最长回文子串
对于字符串的例如最长回文子串或者出现回文子串的索引位置等,似乎都会想到KMP算法,具体记录一下此类型算法题的思路和做法。5.最长回文子串原创 2021-10-28 19:15:21 · 56 阅读 · 0 评论 -
6- 爬楼梯
爬楼梯问题可以转换为斐波那契数列进行求解题目:爬楼梯能够想到的主要关系是:F(N) = F(N-1)+F(N-2)1.递归刚开始想到的是递归但是会超时;(放弃)超时原因计算太多重复的值2.动态规划然后就是因为重复进行计算导致的,选择使用动态规划进行计算;f(1) = 1;f(2) = 2;f(3) = f(1) + f(2) = 3;f(4) = f(3) + f(2) = 5;最简单的就是 直接定义数组,求n3.动态数组利用动态数组 p q r每次.原创 2021-10-28 19:15:02 · 76 阅读 · 0 评论 -
3.leetcode-1669. 合并两个链表
leetcode-合并两个链表:合并链表对于链表的合并一系列的操作,肯定要知道对于原始的链表地址,链表的操作都是对地址的值进行操作。总结:一般需要得到一个链表的操作可以使用,进行一个swap进行指向下一个地址 int[] nums = new int[]{1,2,3}; //source即为链表值 ListNode source = new ListNode(-1); ListNode swap = source;原创 2021-10-22 23:16:54 · 105 阅读 · 0 评论