leetcode刷题
赶路的苟狗
因为相信,所以看见
展开
-
LeetCode每日十题---深度优先搜索(三)
1.题目描述1.1笔者分析以本题为例对深度优先搜索算法和广度优先搜索算法进行一个小小的总结。结合下列代码进行说明。public class Test { private int m; private int n; private int[][] pos={{-1,0},{1,0},{0,1},{0,-1}}; private Queue<List<Integer>> queue=new LinkedList<>();public原创 2020-11-10 10:35:30 · 657 阅读 · 0 评论 -
LeetCode每日十题---深度优先搜索(二)
1.题目描述1.1笔者分析个人觉得这题还是很值得研究的,重点不在如何求解这题,而是一个算法思想,如何将一种类型的题目转换成另一种类型题。虽然这题可以用深度优先搜索来解,但显然是有点复杂的。下面对原问题进行分析。原问题等同于:找到nums一个正子集和一个负子集,使得总和等于target。我们假设P是正子集,N是负子集例如:假设nums={1,2,3,4,5},target=3,一个可能的解决方案是+1-2+3-4+5=3这里正子集p=[1,3,5]和负子集N=[2,4],那么让我们看看如何将其转换为子原创 2020-11-09 09:15:46 · 661 阅读 · 0 评论 -
LeetCode每日十题---深度优先搜索
1.题目描述1.1笔者解答class Solution { public int maxAreaOfIsland(int[][] grid) { int max=0; for(int i=0;i<grid.length;i++){ for(int j=0;j<grid[0].length;j++){ if(grid[i][j]==1){ max=Math.原创 2020-11-08 09:09:08 · 625 阅读 · 0 评论 -
LeetCode每日十题---树(二)
1.题目描述1.1笔者解答class Solution { public boolean isSubPath(ListNode head, TreeNode root) { if (head == null) return true; if (root == null) return false; //这样子如果满足条件,那么一直从根节点往下找,无法退回到以左右孩子为根节点寻找 if原创 2020-10-28 09:33:45 · 580 阅读 · 0 评论 -
LeetCode每日十题---树(一)
1.题目描述1.1笔者分析对于这种高度平衡二叉树,我原来一直认为是很复杂的,左旋转右旋转的。没有想到一个二分就解决了。class Solution { public TreeNode sortedArrayToBST(int[] nums) { return help(nums,0,nums.length-1); } TreeNode help(int[] nums,int l ,int r){ if(r<l)return null;原创 2020-10-23 16:56:48 · 580 阅读 · 0 评论 -
LeetCode每日十题---位运算(一)
1题目描述1.1笔者分析以下均为leetcod官网某一大佬的分析思路:大脑的思考过程这题拿到手,第一反应是用hash表,没有思考细节,只是觉得hash表肯定是可以搞定的,但是空间复杂度是O(n),不满足题意。接着开始思考,如何才能做到空间复杂度是O(1)呢?脑袋开始疯狂打转,但没有思路。没办法,退回原点。心想,如果使用暴力破解法,该如何解决,很简单:每次从数组中去一个数,记为cur,然后从剩下的数中查找,如果找不到,则cur即为要找的那个数,这种解法时间复杂度是O(n*n)。继续思考,如何再原创 2020-10-15 21:10:21 · 613 阅读 · 0 评论 -
LeetCode每日十题---回溯算法(一)
1.题目描述1.1笔者分析很经典的一道递归题目,这里比较巧妙的是+256,只要不会影响到结果,可直接在原数组上修改来实现visited数组的功能。class Solution { public boolean exist(char[][] board, String word) { for(int i=0;i<board.length;i++){ for(int j=0;j<board[0].length;j++){ i原创 2020-10-14 15:52:19 · 591 阅读 · 0 评论 -
LeetCode每日十题---动态规划(二)
1.题目描述1.1笔者分析写动态规划简单题的时候,你会发现套路都一模一样,一个传递函数,到了中等题,就多加了几个传递函数。class Solution { public int maxProfit(int[] prices) { int n=prices.length; if(n==0)return 0; int[] sell=new int[n+1]; int[] buy=new int[n+1]; int[]原创 2020-10-10 14:48:23 · 673 阅读 · 0 评论 -
LeetCode每日十题---分治法
1.题目描述1.1笔者解答class Solution { public int majorityElement(int[] nums) { Map<Integer,Integer> map=new HashMap<Integer,Integer>(); for(int i=0;i<nums.length;i++){ map.put(nums[i],map.getOrDefault(nums[i],0)原创 2020-10-08 10:30:32 · 662 阅读 · 0 评论 -
LeetCode每日十题---二分查找(二)
1.题目描述1.1笔者分析动态规划的方法大家都能想到,关键是用二分法来提高效率。看了下评论区大佬们的方法,确实挺新颖的,把二分法用的如此巧妙。针对这题,dp[i]:所有长度为i+1的递增子序列中,最小的那个序列尾数。由定义知dp数组必然是一个递增数组,可以用maxL来表示最长递增子序列的长度。对数组进行迭代,一次判断每个数num将其插入dp数组相应的位置:1.num>dp[maxL],表示num比所有一直递增序列的尾数都大,将num添加入dp数组尾部,并将最长递增序列长度maxL加1.2.d原创 2020-10-07 10:58:10 · 628 阅读 · 0 评论 -
LeetCode每日十题---二分查找
1.题目描述2.笔者分析先对二分查找做个总结吧,两指针起始位置分别为数组的最小下标和最大下标;比较中间下标对应的值与目标值的大小。若小于目标值,则左指针下标增加到M+1(假设数组递增排序),若大于目标值,则右指针下标递减到M-1;跳出循环的条件为找到目标值或左指针下标大于右指针下标。但二分查找的题一定要学会变通,并非都是这种格式。该题代码如下:int left=0;int right=array.length-1;int mid;while(left<=right){ mid=le原创 2020-10-05 10:54:20 · 676 阅读 · 1 评论 -
LeetCode每日十题---字符串
题目描述1笔者分析1.1没有想到这题也能用递归吧,自我感觉没必要,应该还有更好的办法,但没有想到的是这题递归效率这么高。class Solution { private List<String> res; public List<String> generateParenthesis(int n) { int leftBracket=n,rightBracket=n; this.res=new ArrayList<&g原创 2020-10-04 21:01:05 · 561 阅读 · 0 评论 -
LeetCode每日十题---双指针
题目描述1笔者分析1.1开始觉得这道题每三个数都是必须要相加比较的,也确实是。但是可以将同一个值的数数量累加,这样也能快捷许多,而且用两层for循环就能实现,值得注意的是用排列组合求数量是有多种情况要分类讨论。不过,秀还是秀的,时间效率超过百分之百。class Solution { public int threeSumMulti(int[] A, int target) { int kMaxN=100; int mod=(int)Math.pow(10,9)+7;原创 2020-09-29 10:31:25 · 598 阅读 · 0 评论 -
LeetCode每日十题---链表(三)
题目描述1笔者解答1.1public class Solution { public ListNode detectCycle(ListNode head) { Map<ListNode,Integer> map=new HashMap<>(); while(head!=null){ if(!map.containsKey(head)){ map.put(head,1); }el原创 2020-09-28 14:22:15 · 624 阅读 · 0 评论 -
LeetCode每日十题---链表(二)
题目描述1笔者解答1.1class Solution { public ListNode removeElements(ListNode head, int val) { while(head!=null&&head.val==val){ head=head.next; } if(head==null)return head; ListNode head_copy=head; while(原创 2020-09-27 10:55:30 · 556 阅读 · 0 评论 -
LeetCode每日十题---链表
题目描述1笔者分析1.1我的常规想法是新建两个逆序链表,从后往前比较,但我发现我理解错题目意思了。这个题并不是问两个链表值相等的后缀,它是真的相交与同一链表,所以原来想法不仅复杂了,而且也解决不了问题。看到评论区的大佬解法,链表用的这么秀也是太大佬了。平时我们遍历链表都喜欢用while(node.next),而且一遍遍历解决问题,但如果一遍遍历解决不了问题的话就开始慌了。这题的解法巧妙之处在于while(pA!=pB)这样可以遍历两次链表,而且确实需要两次遍历链表,通过交叉遍历来达到同步的目的是真的六原创 2020-09-25 15:10:39 · 563 阅读 · 0 评论 -
LeetCode每日十题---哈希表(四)
题目描述1笔者解答1.1class Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> IList=new ArrayList<List<String>>(); Map<Map,Integer> IMap=new HashMap<Map,Integer>();原创 2020-09-23 14:53:07 · 590 阅读 · 0 评论 -
LeetCode每日十题---哈希表(三)
题目描述1笔者解答1.1class Solution { public int findMaxLength(int[] nums) { int res=0,sum=0; for(int i=0;i<nums.length;i++){ if(nums[i]==0){ nums[i]=-1; } } Map<Integer,Integer> map=n原创 2020-09-22 16:08:19 · 578 阅读 · 0 评论 -
LeetCode每日十题---哈希表(二)
题目描述1笔者解答1.1class Solution { public int[][] updateMatrix(int[][] matrix) { int m=matrix.length; int n=matrix[0].length; int[][] result=new int[m][n]; int i,j; int min=0; int sum=m*n; for(i=0;i<m;i+原创 2020-09-21 20:46:53 · 532 阅读 · 0 评论 -
LeetCode每日十题---哈希表
题目描述1笔者解答1.1public int countPrimes(int n){ if(n<3) return 0; int count=0; for(int i=2;i<n;i++){ int flag=0; for(int j=2;j<=i/2;j++) { if(i%j==0) { flag=1; break; } } if(flag==0)原创 2020-09-20 19:22:26 · 540 阅读 · 0 评论 -
LeetCode每日十题---数组(五)
题目描述1笔者解答1.1class Solution { public String addStrings(String num1, String num2) { int length1=num1.length(); int length2=num2.length(); int i,j; int last=0; String result=""; for(i=1;i<=length1;i++){ int a=num1.char原创 2020-09-17 19:28:47 · 501 阅读 · 0 评论 -
LeetCode每日十题---数组(四)
题目描述1笔者解答1.1class Solution { public boolean canReorderDoubled(int[] A) { List<Integer> IList=new LinkedList<Integer>(); int i; int length=A.length; for(i=0;i<length;i++){ IList.add(A[i]); }原创 2020-09-16 16:27:32 · 553 阅读 · 0 评论 -
LeetCode每日十题---数组(三)
题目描述1笔者解答1.1class Solution { public boolean canPlaceFlowers(int[] flowerbed, int n) { int length=flowerbed.length; boolean get_1=false; for(int i=0;i<length;i++){ if(!get_1&&flowerbed[i]==0){ if(i原创 2020-09-15 21:23:25 · 551 阅读 · 0 评论 -
LeetCode每日十题---数组(二)
题目描述1笔者解答1.1class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<>(); circle(root,list); return list; } public static void circle(TreeNode root,List<原创 2020-09-14 17:46:07 · 547 阅读 · 0 评论 -
leetCode每日十题---数组
题目描述1笔者解答1.1class Solution { public int maxProfit(int[] prices) { if(prices.length<=1)return 0; int[] max=new int[1]; Mergesort(0,prices.length-1,prices,max); return max[0]>0?max[0]:0; } public static void Merge原创 2020-09-09 16:51:53 · 587 阅读 · 0 评论 -
leetCode每日十题---排序(四)
题目描述1笔者解答1.1class Solution { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> IList=new ArrayList<List<Integer>>(); if(k>n)return IList; int[] match=new int[n+1];原创 2020-09-08 18:00:51 · 549 阅读 · 0 评论 -
leetCode每日十题---排序(三)
题目描述1笔者解答1.1class Solution { public String findLongestWord(String s, List<String> d) { PriorityQueue<String> queue=new PriorityQueue<>((o1,o2)->{ if(o1.length()==o2.length()){ return o1.compareTo(o2);原创 2020-09-07 20:50:49 · 500 阅读 · 0 评论 -
leetCode每日十题---排序(二)
题目描述1笔者解答1.1class Solution { public int[] findDiagonalOrder(List<List<Integer>> nums) { //m行n列 int m=nums.size(); int sum=0; int i; for(i=0;i<m;i++){ int temp=nums.get(i).size(); sum+=temp; }原创 2020-09-06 18:42:09 · 527 阅读 · 0 评论 -
leetCode每日十题---排序
题目描述1笔者解答1.1class Solution { public int[] relativeSortArray(int[] arr1, int[] arr2) { Map<Integer,Integer> map=new HashMap<Integer,Integer>(); HashSet<Integer> set=new HashSet<Integer>(); int[] match=new int原创 2020-09-05 21:23:20 · 553 阅读 · 1 评论 -
leetCode每日十题---堆(难度:困难)
题目描述1笔者分析1.1直到现在我还是会对这种类似于多决策问题产生畏惧,我总是会认为它很复杂,因为它有多种多样的走法,和判定条件。但每次看到题解,就又会惊叹于如此少量的代码就可以实现。因为单从代码来看,你是看不出来它是在写这题的,一个很大众很简洁的处理方式。不过看到这种类似多决策问题的题,递归就完事了。class Solution { public int swimInWater(int[][] grid) { int N=grid.length; int原创 2020-09-04 21:00:17 · 601 阅读 · 0 评论 -
leetCode每日十题---堆(难度:中等)二
题目描述1笔者解答1.1class Solution { public int getKthMagicNumber(int k) { HashSet<Integer> set=new HashSet<>(); int[] params=new int[]{3,5,7}; PriorityQueue<Integer> queue=new PriorityQueue<>(); queue.offer(1原创 2020-09-03 20:08:34 · 660 阅读 · 0 评论 -
leetCode每日十题---堆(难度:中等)
题目描述1笔者解答1.1class Solution { public int nthUglyNumber(int n) { int count=1; int num_result=1; while(count<n){ num_result++; int num=num_result; boolean getone=false; do {原创 2020-09-02 16:08:29 · 812 阅读 · 0 评论 -
leetCode每日十题---栈(难度:困难)
题目描述1笔者解答1.1class Solution { public boolean PredictTheWinner(int[] nums) { return total(nums,0,nums.length-1,1)>=0; } public int total(int[] nums,int start,int end,int turn){ if(start==end) return nums[start]*turn;原创 2020-09-01 19:08:10 · 669 阅读 · 0 评论 -
leetCode每日十题---栈(难度:中等)三
题目描述1笔者解答1.1class Solution { public int scoreOfParentheses(String S) { Stack<Integer> stack=new Stack<Integer>(); //-1代表左括号 for(int i=0;i<S.length();i++){ if(stack.isEmpty()||S.charAt(i)=='(原创 2020-08-31 18:06:48 · 635 阅读 · 0 评论 -
LeetCode每日十题---栈(难度:中等)二
题目描述1笔者解答1.1class Solution { public String removeKdigits(String num, int k) { Stack<Character> stack=new Stack<Character>(); stack.push(num.charAt(0)); for(int i=1;i<num.length();i++){ char原创 2020-08-30 17:55:21 · 610 阅读 · 0 评论 -
LeetCode每日十题---栈(难度:中等)
题目描述1笔者解答1.1class Solution { public String shortestPalindrome(String s) { int length=s.length(); for(int i=length-1;i>=0;i--) { for(int j=0;j<=i/2;j++) { if(s.charAt(j)!=s.charAt(i-j))原创 2020-08-29 16:23:15 · 603 阅读 · 0 评论 -
LeetCode每日十题---栈(难度:简单)
题目描述1笔者解答1.1笔者分析1.2虽然执行结果通过了,但看到执行用时和内存消耗,真是有点头疼。想了想,这次刷的是栈,但自己根本没有用到栈,看了些大佬们的解法,做了些总结,呃。。。好像都差不多。。。(过)。题目描述2笔者解答2.1class Solution { public int calPoints(String[] ops) { int i; int score=0; int last_get=0; int last_g原创 2020-08-28 19:45:29 · 661 阅读 · 0 评论