
leetcode
dtzly
这个作者很懒,什么都没留下…
展开
-
Leetcode字符串
1. LC724 找到数组的“中心下标”,使其左边之和等于右边之和,没有返回-1.class Solution { public int pivotIndex(int[] nums) { int sum = 0,left = 0; for(int num:nums){ sum+=num; } for(int i=0; i<nums.length; i++){ if(left*2原创 2021-06-06 19:33:04 · 226 阅读 · 0 评论 -
724. 寻找数组的中心下标
题意给定一个整数数组,返回“中心下标”。“中心下标”的定义是其左边元素之和等于右边元素之和。思路1先算出所有数组的元素之和sum,然后遍历该数组:每次算左边的元素之和(因为考虑边界需要算上当前元素)left_sum,如果(left_sum-nums[i])*2+nums[i]==sum 则返回该元素下标,否则返回-1。class Solution { public int pivotIndex(int[] nums) { int sum=0; for(int原创 2021-03-26 16:28:53 · 98 阅读 · 0 评论 -
134. 加油站
题意汽车可以装无限的汽油,现在所有的加油站组成一个循环链。每个加油站你可以充汽油的值:gas,从该加油站到下一个加油站的耗费:cost。要问你从哪个加油站出发才能保证可以畅游全程。分析假设我们从0加油站出发每次求净值(当前可充的汽油值gas减去从当前点出发的耗费)并记录最小值。如果一圈下来,当前最小值已被后面加油站补血大于等于0,那么我们完全可以从0点出发。如果最小值为负,那么我们从后往前补血如果可以使得最小值为正那就从该点出发。如果补血不成功,那么整个环无论从哪个点出发都要GG。代码class原创 2021-03-01 13:50:33 · 130 阅读 · 0 评论 -
leetcode组合问题汇总
###39. 组合总和题意: candidates无重复元素,可以从待选数组中无限次选中一个数字。class Solution { private void dfs(List<List<Integer>> res,List<Integer>tmp,int []candidates, int target, int cur){ int size = candidates.length; if(target == 0) ..原创 2021-01-22 15:16:38 · 124 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
思路这道题可以使用栈解决,可以先翻转链表解决。本道题记录下使用递归解决的思路,后面有时间再记录前两种。 使用递归解决,如果是直接打印不需要返回数组,伪代码如下:public void printFunc(ListNode head){ if(head==null) return;System.out.println(head.val);printFun(head.next);}但是这道题别扭的点在于最后要返回一个数组格式,这个时候需要在递归中带入数组并且需要记录数组的下表。代码/**原创 2020-12-25 09:30:01 · 85 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
思路题意是给定一个[m,n]的方格子,机器人从左上向右下一定每次移动不能超过k,而k的值是每个格子坐标的数位之和,求该机器人能到达多少格子。我们从(0,0)坐标开始往右或者往下dfs,在遇到越界或者计算坐标数位和大于k或者已经访问过了则return 0。代码class Solution { private int cal(int x,int y){ int sum = 0; while(x!=0){ sum+=x%10;原创 2020-12-24 16:43:23 · 89 阅读 · 0 评论 -
130. 被围绕的区域
思路题意是要将被字符’X’包围的‘O’改成‘X’,注意如果’O’在边界则永远不会被包围。这道题如果从边界开始思考问题解决起来会比较顺手,如果边界全是‘X’则里面的‘O’全部改变;如果边界出现一个’O’则顺着这个‘O’进行dfs,它所连接的‘O’全部不能被包围,则剩下的区域全部置于‘X’。代码class Solution { private void dfs(int x,int y,char[][]board){ if(x<0||x>=board.length||y&原创 2020-12-24 14:28:31 · 88 阅读 · 0 评论 -
617. 合并二叉树
思路1题意是要按照节点对应位置把两颗二叉树进行合并。我们可以同时dfs这两颗二叉树,递归出口分三种情况判断:都空则返回null;一个空一个不空返回不空的。然后左递归,右递归。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x;原创 2020-12-24 12:03:00 · 88 阅读 · 0 评论 -
127. 单词接龙
思路这个题目意思是给定一个源字符串和目标字符串以及单词字典,要求从源字符串变到目标字符串每次只能改变一个字符并且改变后的字符串都能在字典找到。使用bfs,将源字符串进入队列把字典中和源字符相差1个字符入队列,再以此类推。。class Solution { public int ladderLength(String beginWord, String endWord, List<String> wordList) { Set<String> dictSe原创 2020-12-23 20:21:07 · 117 阅读 · 0 评论 -
回溯算法
216. 组合总和 III思路:题意是给定[k,n], 从1-9中选出k个数字,他们的和等于n。做法是枚举1-9的数字进行深搜。这里要注意JAVA的深拷贝和浅拷贝。代码:class Solution { private void dfs(List<List<Integer>> res, List<Integer> tmp, int cur, int n, int k){ //如果候选数字的个数达到k并且和是n(n每次遇到新元素减去直到为0)原创 2020-12-13 23:30:55 · 170 阅读 · 0 评论 -
79. 单词搜索
思路题意是判断目标单词是否存在于二维网格中。思路是使用dfs搜索,遍历这个二维网格并沿着某一个点向它四个方向判断找到这个单词则返回true。我们可以开一个visited二维布尔数组来记录改点是否访问,当然更解决空间的方式是更改二维网格的字符。代码class Solution { private boolean dfs(char[][]board,String word,int i,int j,int index){ //边界判断,当前字符是否相等以及是否遍历到目标单词的最后一位原创 2020-12-10 15:16:29 · 240 阅读 · 0 评论 -
剑指 Offer 19. 正则表达式匹配
思路实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。1)初始化dp[i][j]表示s字符串的前i个字符和p字符串的前j个字符是否匹配,初始化都是false。很显然前0个字符都是匹配的: dp[0][0]=true。如果第i-1个字符是* 并且dp[0][i-2]是true 那么dp[0][i-2] = true;2) s的第i-1个字符和p的j-1个字符匹配或者p的j-1个字符是.则 dp[i][原创 2020-12-09 11:02:42 · 86 阅读 · 0 评论 -
659. 分割数组为连续子序列
思路题意是将一个升序子序列分割成多个长度至少为3的连续子序列。举个例子:[1,2,3,3,4,4,5,5] ,这道题可以用自动状态机的思路去解题,我们分为三个长度1,2,3的状态,很显然当长度大于等于3时可以随意增加或者停止append子序列,所以我们应该尽快让每个子序列长度达到3。综上,这道题是一个自动机+贪心的思路。 值:1 2 3 4 5len = 1 1 0 1 0 0len = 2 0 1 0 1 0len>原创 2020-12-06 23:05:56 · 137 阅读 · 0 评论 -
35. 搜索插入位置
思路给定一排序数组和待插元素,若存在则返回位置不存在则返回插入位置。二分,若存在直接返回对应下表,若不存在则找到数组中比目标元素小的那个元素的位置,返回该位置+1.代码class Solution { public int searchInsert(int[] nums, int target) { int size = nums.length; int ret =-1; for(int l=0,r=size-1;l<=r;){原创 2020-12-04 21:22:53 · 75 阅读 · 0 评论 -
34 在排序数组中查找元素的第一个和最后一个位置
思路二分查找,找目标值在数组中的左右端点。代码class Solution { public int[] searchRange(int[] nums, int target) { int []ret = new int[]{-1,-1}; int size = nums.length; //寻找目标值最左端点 for(int l=0,r=size-1;l<=r;){ int mid = (l+r)&原创 2020-12-04 14:49:07 · 78 阅读 · 0 评论 -
33. 搜索旋转排序数组
思路题意是一个升序数组按照数组内随机的点进行旋转,判断target是否存在该数组中并返回对应的位置。这道题使用最暴力的方法也能过但并非出题的目的。仔细想想如果查找有序数组元素存在一般使用二分查找时间复杂度O(logN)。这道题仅仅是在中间某个点的位置做了旋转,还是保留了原来有序数组很多特征,思路1:能否先找到断点和target比较,然后根据断点前后皆为有序的特征进行查找,思路2:边查找target过程中比较头尾(l,r),分三种情况:(1. r>=mid>=l则此段数组有序,二分查找之 (2原创 2020-12-04 11:55:16 · 93 阅读 · 0 评论 -
32. 最长有效括号(未完待续)
思路题目是要求给定一个字符串,求满足左右括号规范的最大连续子串。满足左右括号规范的常用手段可以计左括号为1,右括号为-1遍历到最后和是0则满足规范或者使用栈:将左括号push进去遇到右括号则弹出最后栈空则满足规范。这个问题解决的思路有:思路一:定义一个二维数组dp[i][j]表示以第i个字符结尾最长有效括号的长度:其中i表示第i个字符,j表示在i之前的字符 。假如j+value>=0则可继续追加字符。状态转移方程为:dp[i+1][j+value] = max(dp[i][j]+1, 1)原创 2020-12-01 08:21:02 · 143 阅读 · 0 评论 -
31. 下一个排列
思路主要思路是从后向前遍历找到最长“不增区间”的前一个元素比如:[1,2,3,7,4]找到[7,3]前的一个元素3;在[7,4]中找到该区间最小且大于3的元素4;swap 3,4–>[1,2,4,7,3]; 对于[7,3]排序–>[1,2,4,3,7]代码class Solution { public void nextPermutation(int[] nums) { int size = nums.length; int i = 0;原创 2020-11-26 15:57:52 · 78 阅读 · 0 评论 -
30. 串联所有单词的子串
思路字符串排序,枚举s所有的子串,一一比较。代码class Solution { public List<Integer> findSubstring(String s, String[] words) { //将字符串数组排序 Arrays.sort(words); List<Integer> res = new ArrayList<>(); //单个字符串的大小 int wor原创 2020-11-26 10:33:25 · 90 阅读 · 0 评论 -
29. 两数相除
思路题目要求将两数相除,不使用乘法、除法和 mod 运算符,那最朴素的做法就是每次减被除数、计数器++但是这样做很明显会超时。改进思路是对被除数减的时候使用倍增的方法(二分)。在Java中,当t=Integer.MIN_VALUE时(t取相反数依旧是它本身)此时可能存在越界问题,因此都用负数进行计算.代码class Solution { public int divide(int dividend, int divisor) { if(divisor==0||(divi原创 2020-11-26 09:21:00 · 117 阅读 · 1 评论 -
25. K 个一组翻转链表
思路每次找到需要翻转的起始点以及结束点的下一个指针代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val原创 2020-11-24 14:23:23 · 123 阅读 · 0 评论 -
222. 完全二叉树的节点个数
思路普通解法是顺着思路递归就可以AC,看到题解里有利用完全二叉树的性质进行计算感觉十分有趣,遂尝试下这种思路。完全二叉树是满二叉树的一个变种,假如左右子树高度相同说明左子树为满二叉树,直接计算之再对右子树进行递归统计;假如左子树比右边子树高说明最后一整层没满but倒数第二层满了计算右子树再对左子树递归之。该思路的代码/** * Definition for a binary tree node. * public class TreeNode { * int val; *原创 2020-11-24 10:23:25 · 109 阅读 · 0 评论 -
452. 用最少数量的箭引爆气球
思路贪心,对于每个气球至少安排一个弓箭手就可以射穿;在射穿该气球的同时我们尽可能地往后移动击穿尽可能多的其他气球。按照气球的左端点从小到大排序维护左右区间代码class Solution { public int findMinArrowShots(int[][] points) { if(points.length==0) return 0; Arrays.sort(points,(o1,o2)->(o1[0]<o2[0]?-1:1));原创 2020-11-23 19:05:42 · 114 阅读 · 0 评论 -
92. 反转链表 II
思路找到逆置段开始的节点(前一个节点):将head向前移动m-1并且使用modify_tail存储逆置后的尾节点,so easy逆置n-m+1中间段,注意:再次过程中head其实就像个游标完成整个任务而result用来保存最开始head指向的位置。这样,我们其实有了三段链表:result—>pre; new_head—>modify_tail;head–>lastnode; 最后只需要链接即可。...原创 2020-11-22 16:05:59 · 87 阅读 · 0 评论