leetcode
牛客网leetcode148
韩运畅
这个作者很懒,什么都没留下…
展开
-
二分查找极其变种
注意:证明思路都一样,全都是left或right会不会越过某一值(一般是目标值)一、基本的二分查找 int left=0,right=A.length-1,mid=0; while(left<=right){ mid=(left+right)/2; if(A[mid]==target){ break; }else if(A[mid]>target){原创 2020-11-27 14:10:31 · 92 阅读 · 0 评论 -
并查集经典代码解读
//并查集 代码解读class UnionFind { int[] ancestor; public UnionFind(int n) { ancestor = new int[n]; for (int i = 0; i < n; ++i) { ancestor[i] = i; } } //让index1的根等于 index2的根,相当于合并两个元素所在的集合 public v原创 2020-11-04 17:14:37 · 81 阅读 · 0 评论 -
寻找倒数第n个节点的经典写法
//寻找倒数第n个节点的经典写法,前置条件n是合法的 public ListNode removeNthFromEnd (ListNode head, int n) { ListNode Head=new ListNode(-1); Head.next=head; ListNode pre=Head,fast=Head; while(n-->0) fast=fast.next; while(fast.nex...原创 2020-07-03 08:42:02 · 141 阅读 · 0 评论 -
辗转相除法求最大公约数
//保证detaX>=0,detaY>=0//注意前面是先判断detaY==0,后面就是detaX%detaY的形式,否则就是先判断detaX==0,后面跟detaY%detaX的形式 private int getGY(int detaX, int detaY) { return detaY==0?detaX:getGY(detaY,detaX%detaY); }...原创 2020-05-25 08:03:29 · 237 阅读 · 0 评论 -
leetcode经典题目:word-search
题目:给出一个二维字符数组和一个单词,判断单词是否在数组中出现,单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。例如:给出的字符数组=[↵ ["ABCE"],↵ ["SFCS"],↵ ["ADEE"]↵]单词 ="ABCCED", -> 返回 true,单词 ="SEE", ->返回 true,单词 ="ABCB", -> 返回 false.思路:先循环,然后挨个DFS+回溯,这里的回溯使用的是异或运算符,因为ascii码原创 2020-05-24 15:09:39 · 695 阅读 · 0 评论 -
leetcode经典题目: convert-sorted-list-to-binary-search-tree
题目:给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)思路:递归,通过快慢指针求出middle,可以通过额外一个指针,每次都比middle慢一拍,拿到midlle前面的节点。注意这里的middle一定要是一半或一半+/-1。在本题的解法中middle等于恰好中间节点或者第len/2+1个节点。如何得到这个结论?只需要这样考虑,初始时,slow为head, fast为head。然后,slow每走一步,奇数情况下,fast刚好能走到最后一个节点,此时slow刚好落在中间节点,偶原创 2020-05-24 14:46:34 · 69 阅读 · 0 评论 -
leetcode经典题目:balanced-binary-tree
题目:判断给定的二叉树是否是平衡的在这个问题中,定义平衡二叉树为每个节点的左右两个子树高度差的绝对值不超过1的二叉树思路:递归,不平衡的子树返回-1 boolean flag=false; public boolean isBalanced(TreeNode root){ if(root==null) return true; return getDepth(root)!=-1; } private int getHeight原创 2020-05-24 14:11:29 · 110 阅读 · 0 评论 -
leetcode经典题目:rotate-list
题目:将给定的链表向右转动k个位置,k是非负数。例如:给定1->2->3->4->5->null , k=2,返回4->5->1->2->3->null。思路:先计算出len,然后首尾相连,从尾走len-n%len步,新head便是p.next ListNode rotateRight(ListNode head,int n){ if(head==null) return null; int原创 2020-05-24 11:49:47 · 106 阅读 · 0 评论 -
leetcode经典题目:wildcard-matching
题目:请实现支持'?'and'*'.的通配符模式匹配'?' 可以匹配任何单个字符。↵'*' 可以匹配任何字符序列(包括空序列)。↵↵匹配应该覆盖整个输入字符串(而不是部分)。↵函数声明为:↵bool isMatch(const char *s, const char *p)↵↵下面给出一些样例:↵isMatch("aa","a") → false↵isMatch("aa","aa") → true↵isMatch("aaa","aa") → false↵isMatch("aa", "*") → t原创 2020-05-24 11:25:09 · 267 阅读 · 0 评论 -
leetcode经典题目:multiply-strings
题目:给出两个用字符串表示的数字,将两个数字的乘积作为字符串返回。备注:数字可以无限大,且是非负数https://www.nowcoder.com/profile/641341/codeBookDetail?submissionId=6919337思路:先将对应位的计算结果放到对应位置,然后再进行carry,最后toString public String multiply(String num1,String num2){ int n1=num1.length();原创 2020-05-24 11:04:05 · 155 阅读 · 0 评论 -
leetcode经典题目:word-breakii
题目:给定一个字符串s和一组单词dict,在s中添加空格将s变成一个句子,使得句子中的每一个单词都是dict中的单词返回所有可能的结果例如:给定的字符串s ="catsanddog",dict =["cat", "cats", "and", "sand", "dog"].返回的结果为["cats and dog", "cat sand dog"].思路:DFS+map缓存结果(没有显示地用到回溯) public ArrayList<String> wordBreak(St原创 2020-05-24 10:43:08 · 163 阅读 · 0 评论 -
leetcode经典题目:palindrome-partitioning-ii
题目:给出一个字符串s,分割s使得分割出的每一个子串都是回文串计算将字符串s分割成回文分割结果的最小切割数例如:给定字符串s="aab",返回1,因为回文分割结果["aa","b"]是切割一次生成的。思路:动态规划、dp方程dp[i]:表示字串(0,i)的最小回文切割,则最优解在dp[s.length-1]中。分几种情况:1.初始化:当字串s.substring(0,i+1)是回文时,dp[i]=0(表示不需要分隔);否则,dp[i]=i(表示至多分割i次);2. 对于任意大于1的i,如果原创 2020-05-24 10:26:15 · 82 阅读 · 0 评论 -
leetcode经典题目:gas-station
题目:环形路上有n个加油站,第i个加油站的汽油量是gas[i].你有一辆车,车的油箱可以无限装汽油。从加油站i走到下一个加油站(i+1)花费的油量是cost[i],你从一个加油站出发,刚开始的时候油箱里面没有汽油。求从哪个加油站出发可以在环形路上走一圈。返回加油站的下标,如果没有答案的话返回-1。注意:答案保证唯一。思路:类似于求数组和最大的子序列。累加在每个位置的left+=gas[i]-cost[i].就是在每个位置剩余的油量,如果left一直大于0,则可一直走下去,如果left小于0,那原创 2020-05-24 10:07:09 · 421 阅读 · 0 评论 -
leetcode经典题目- single-number-ii
题目:现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现三次。你需要找出只出现一次的元素注意:你需要给出一个线性时间复杂度的算法,你能在不使用额外内存空间的情况下解决这个问题么?解法:将int型数字看成一个位容器 public int singleNumber(int[] A) { int ones=0; int twos=0; for(int i=0;i<A.length;i++){原创 2020-05-24 09:53:33 · 170 阅读 · 0 评论 -
leetcode经典题目之word-break
题目:链接:https://www.nowcoder.com/questionTerminal/5f3b7bf611764c8ba7868f3ed40d6b2c?answerType=1&f=discussion来源:牛客网给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。例如:给定s=“leetcode”;dict=["leet", "code"].返回true,因为"leetco原创 2020-05-24 09:23:17 · 375 阅读 · 0 评论 -
字符串转换为整数时如何判断接下来是否溢出
public int StrToInt(String str) { if(str==null||str.length()==0) return 0; char[] arr=str.toCharArray(); int flag=1,index=0,sum=0; if(arr[0]=='-'){ flag=-1;index++; }else if(arr[0]=='+'){ index++...原创 2020-05-23 10:32:05 · 422 阅读 · 0 评论 -
牛顿迭代法求平方根
⚠️代码写的有问题,while 循环应该是大于号 -2020.11.1原创 2020-05-07 07:15:42 · 75 阅读 · 0 评论 -
利用一个len==26的字符数组过滤两个字符串元素集是否相同
//******参考牛客网的减枝,O(n)过滤两个字符串元素集是否相同,很巧妙****** int [] c =new int[26]; for(int i=0;i<s1.length();i++) { c[s1.charAt(i)-'a']++; c[s2.charAt(i)-'...原创 2020-05-04 09:21:09 · 72 阅读 · 0 评论 -
leetcode求所有不重复的子集
//首先在代码中我们会先对其做些初始化的操作,然后递归进行,=详见代码//如果我们得到了长度为k的所有不重复子集,那么我们便可以由此生成所有长度为k+1的不重复子集//步骤是:对于每一个k子集,我们只从其最大下标以后的元素挑选,并且对于相同的元素只组装一次,组装成k+1的集合//反证法可证明1.得到的是全部的k+1子集 2.不存在重复的k+1子集代码示意图:具体代码解答链接:http...原创 2020-05-03 11:33:37 · 267 阅读 · 0 评论 -
坑--ArrayList的remove方法
/* tmp.remove(root.val);//天坑,ArrayList有remove(int index),remove(Object obj),所以这样会走第一个方法,从而数组越界 tmp.remove(new Integer(root.val));//修改成这样依然坑,它会将遇到的第一个元素删除,也就是说无法删除正确位置的元素从而造成bug */ ...原创 2020-05-01 13:08:11 · 226 阅读 · 0 评论 -
arraylist的set与add
ArrayList<Integer> arr=new ArrayList<>(rowIndex+1); arr.set(0,1)//会报错,原因是,它先会检查index是否超出size,而size记录该 list中已经添加的元素的数量,只能通过add才会造成size++ //所以,添加值的时候只能add,修改值的时候才能se...原创 2020-05-01 10:40:38 · 947 阅读 · 0 评论 -
leetcode经验
public void solve(char[][] board) { for(int i=0;i<board.length;i++){ int start=0,end=board[i].length-1; //顺序不能乱 while(start<=end&&board[i][st...原创 2020-04-29 08:58:25 · 83 阅读 · 0 评论 -
动态规划、分治、贪心的操作流程
动态规划:将原问题分解为当前解与子问题,递归进行分治:将原问题分解为多个子问题,然后合并贪心:以初始解作为条件,一步一步往下走,每一步都是局部最优解...原创 2020-04-25 08:43:00 · 95 阅读 · 0 评论 -
快慢指针原理
原创 2020-04-25 07:28:30 · 603 阅读 · 0 评论