![](https://img-blog.csdnimg.cn/20190823225122842.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
刷题小本本
做过的编程题的一个归纳总结,理清思路。整理给需要的人,同时方便管理复习。
致宁
不安于现状才能不断努力
展开
-
【简单】88. 合并两个有序数组
用两个数组的最后一个值做比较,如果nums2比较大,那么就把nums2的最后一个值放在nums1的最最后面,然后nums2的最后一位- -;否则,就把nums1的最后一位放在最最后面,nums1的最后一位 - -;循环截止的条件是数组2的最后一位<0。题中说明两个list已经是升序排列的,而且nums1的后面有留出空间放数字,所以把nums2的值从后面插入,元素移动的会相对少一些。需要注意的是两个数组分别为空的场景~~原创 2023-03-19 17:01:54 · 225 阅读 · 0 评论 -
【leetcode】(中等)347. 前 K 个高频元素 hash & heap
class Solution { public List<Integer> topKFrequent(int[] nums, int k) { //用map统计频数 HashMap<Integer,Integer> map = new HashMap<>(); for(int i:nums){ ...原创 2020-03-15 12:54:44 · 231 阅读 · 0 评论 -
【leetcode】(中等)dp 64. 最小路径和
class Solution { public int minPathSum(int[][] grid) { int m =grid.length, n = grid[0].length; for(int i =0; i<m; i++){ for(int j=0; j<n; j++){ ...原创 2020-03-15 14:41:49 · 384 阅读 · 0 评论 -
【leetcode】(中等)236. 二叉树的最近公共祖先
class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //结束条件 if(root == null) return root; //root即为最近公共祖先 if(root == ...原创 2020-03-15 13:56:44 · 341 阅读 · 0 评论 -
【leetcode】(中等)递归 24.链表中相邻的结点交换
看到了一个很厉害的递归,逐行注解一下写递归不要关注里面的内容,只关注它的功能。内容的话,想好终止条件,和最后一次循环的操作思路。比如这个递归到最深的一层就是,head所指->next所指->null最后要得到 next所指 -> head所指 -> null/** * Definition for singly-linked list. ...原创 2020-03-14 15:33:44 · 231 阅读 · 0 评论 -
【leetcode】(中等)dp 647.回文子串数 5. 最长回文子串
1.回文子串数这道题我是用dp,创建一个dp二维数组,用来存放dp[i][j]这个字串是不是回文串。也可以表达:如果最后一个字符和第一个字符相等,而且中间的子串是一个回文串,那么i-j就是回文子串dp[ i ] [ j ] = dp[ i+1] [j-1]&& ( s.charAt( i ) == s.charAt( j ) )要注意的是,中间的...原创 2020-03-14 13:52:58 · 252 阅读 · 0 评论 -
【LeetCode】SQL(简单)627. 交换工资
思路:就像不用中间变量交换两个数值一样,还记得有一种方法是用异或,所以可以用这种思路想这道题代码:update salary set sex=char(ascii('f')+ascii('m')-ascii(sex));...原创 2019-12-25 15:47:06 · 185 阅读 · 0 评论 -
【LeetCode】SQL(简单)182.查找重复的电子邮箱
思路:通过看评论大神和解题有以下几种方法解决:通过多表联查;两次访问Person表,找到id不同但是Email相同的Email并输出,需要注意的是要把输出结果进行去重(distinct)。通过分组;将Person表按照Email分组,并count出每个组中的Email总数,将大于1的Email输出。【最快】代码:select distinct p1.Emailfrom Pers...原创 2019-12-25 15:30:03 · 271 阅读 · 0 评论 -
【LeetCode】(简单)7.整数反转
思路:1.一开始是想转成字符数组,反转之后再转成int类型,不知道怎么就一直通过不了。看了评论和解题,将x的最后一位迭代10,然后更新最后一位。2.就像这样,res = res10 + x%10 ; x /=10;代码:class Solution { public int reverse(int x) { //防止数据溢出,使用long long...原创 2019-12-17 23:29:51 · 107 阅读 · 0 评论 -
【LeetCode】(简单)14.最长公共前缀(java,substring)
import java.util.*;class Solution { public String longestCommonPrefix(String[] strs) { if(strs.length ==0) return ""; String res = strs[0]; for(int i =1; i<strs.lengt...原创 2019-12-17 17:16:11 · 185 阅读 · 0 评论 -
【LeetCode】(简单)20. 有效的括号(java,Satck解决)
代码:思路在备注都很清楚了import java.util.*;class Solution { public boolean isValid(String s) { if(s == null) return false; Stack<Character> stack = new Stack<>(); cha...原创 2019-12-17 16:44:39 · 142 阅读 · 0 评论 -
【LeetCode】(简单)141.环形链表(双指针法)
思路:链表类的题,一般要想到指针,双指针法。链表相交,链表成环等。在成环链表中,快慢指针一定会相遇,就比如说在操场跑步,同一起点,快的人跑两圈,慢的人只跑一圈,第一圈一定不会相遇,第二圈一定会相遇。那么如果不是操场那样的圈,而是笔直的公路,那就是快的人先到达终点,然后结束。代码:public class Solution { public boolean hasCycle(L...原创 2019-12-17 15:51:19 · 198 阅读 · 0 评论 -
【LeetCode】(简单)231. 2的幂(3种思路)
思路:最普通的思路就是无限的给这个n除以2,看它最后是不是等于1。但是这个方法特别耗内存,性能较低。看leetcode评论说,2的幂一定可以被2的31次幂整除,这也可以判断。最最最精妙的方法就是用二进制来做。如果这个数的二进制只有一位1,那就是2的幂。那怎么判断是不是只有1位呢。举个例子,8的二进制是1000,7的二进制是0111,在《剑指offer》上有过怎么消除最低位的1的方法。那就...原创 2019-12-17 15:26:37 · 126 阅读 · 0 评论 -
【LeetCode】(简单)155. 最小栈(空间解决时间,2种方法)
思路:要求O(1)复杂度找到,不遍历整个集合是不可能的。但如果牺牲空间复杂度来满足这个要求 也是可以的。有两种思路:用两个栈。一个存储元素本身,一个存储当前最小的元素。那么入栈就得两个都入,出栈也是。用一个栈,但是存两倍个数的元素。第一层存元素本身,第二层存当前最小值,入栈入两次,第二次判断最小元素并存入。出栈也是。接下来就只看第二种方法的代码:class MinStack {...原创 2019-12-16 17:14:23 · 475 阅读 · 0 评论 -
【LeetCode】(简单)26. 删除排序数组中的重复项(双指针法)
代码:至于思路都已经备注了,双指针法class Solution { public int removeDuplicates(int[] nums) { if(nums.length<=1) return nums.length; //mark是标记插入位置的,comp是标记下一个元素和谁比较 int mark =1; int c...原创 2019-12-16 16:00:56 · 125 阅读 · 1 评论 -
【LeetCode】(简单)160. 相交链表(四种方法,java)
思路1:1.先确定两个链表有没有相交2.有的话,最后一个结点一定相同3.遍历两个链表到末尾,判断相同与否,顺便计算两个链表长度4.计算长度差,然后求出相交链表的头节点代码1:public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ...原创 2019-12-16 15:33:02 · 234 阅读 · 0 评论 -
【LeetCode】(简单)9. 回文数
思路1:将问题转为判断回文字符串代码1:class Solution { public boolean isPalindrome(int x) { if(x <0) return false; if(x ==0) return true; //int转为String String str = I...原创 2019-12-15 15:16:29 · 118 阅读 · 0 评论 -
【LeetCode】(简单)21. 合并两个有序链表
思路:这个和归并排序一样,两个数组中先挑小一点的连接到新链表上,当有一个链表遍历完成之后,将另一个链表的所以结点都续到新节点最后即可。代码:class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //新链表的起点 ListNode newhead ...原创 2019-12-15 14:27:59 · 124 阅读 · 0 评论 -
【LeetCode】(简单)169. 多数元素
思路:出现次数大于数组长度的一半,意思就是,排序后n/2下标一定是那个数,不然就小于了一半。代码:import java.util.*;class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/...原创 2019-12-15 14:14:12 · 96 阅读 · 0 评论 -
【LeetCode】(简单)235. 二叉搜索树的最近公共祖先
思路:1. 还是那句话,关于二叉树的问题一定要想到用递归,而递归是不关心方法的具体实现的。2. 再想想二叉搜索树的特点,root的值是比左边大,比右边小的。所以如果p和q一个在左一个在右,那最近的公共祖先就是root。3. 如果都在左边,那就把left结点传进方法中作为root结点,继续寻找公共祖先。反之。代码:class Solution { publi...原创 2019-12-15 14:06:12 · 114 阅读 · 0 评论 -
【LeetCode】(简单)136. 只出现一次的数字
思路:1. 利用map集合存储,key存储数值,value存储出现次数;空间复杂度为O(n),时间复杂度为O(n)2. 利用异或运算,首先知道一个结论,i ^ i = 0; 0 ^ i = i ; 所以两个相同的数异或等于0;在和出现一次的那个数值进行异或得到的就是那个数;空间复杂度O(1),时间复杂度O(n)代码:以第二种简单的方法为主:class Solution...原创 2019-12-15 13:51:11 · 115 阅读 · 0 评论 -
【LeetCode】(简单)344. 反转字符串
思路:1. 最偷懒的应该是把字符数组从后向前打印一遍,但是实质上并没有更改数组内容,不推荐;2. 和交换两个元素一样,把数组从中间分开,两两交换;而交换的方法就有两种种,异或、开辟新空间。3. i ^= j; j ^= i; i ^= j; 这样就交换了i和j的值; 可以这么理解,i和j异或后,得到了一个中间的钥匙,i和这个钥匙异或就得到了j,反之,j和这个钥匙异或就得到了i;...原创 2019-12-15 13:23:45 · 139 阅读 · 0 评论 -
【LeetCode】(简单)557. 反转字符串中的单词 III
思路:最好想到的就是用空格把单词分开,挨个反转,最后再把空格加上。至于这个反转,StringBuilder和StringBuffer中有方法可以直接用。当然自己写也可以,完全没难度。代码:class Solution { public String reverseWords(String s) { String[] strs = s.split(" ");...原创 2019-12-14 16:47:57 · 92 阅读 · 0 评论 -
【LeetCode】(简单)292. Nim 游戏
思路:先说结论:作为先手,如果堆中石头的数量n不能被4整除,那么你总是可以赢得 Nim 游戏的胜利。原因:1.小于3块的话,你作为先手就可以全拿走,结束游戏。2.如果刚好4块的话,作为先手一定会输,因为对手一定会拿走最后一块。所以在自己的回合中应避免自己剩下4个。3.但是如果不是4倍数的话,就可以控制将4个留给对手,那么自己必定会赢。比如7,那就先把后四个排除,剩下3个...原创 2019-12-14 16:24:49 · 107 阅读 · 1 评论 -
【LeetCode】(简单)104. 二叉树的最大深度(一行代码实现)
思路:关于二叉树的题目,一定要想到递归;递归的话,无需关注方法内部怎么实现的,只需使用它即可。有一个寻求最大深度的方法,它的作用就是寻找最大深度,那么一个结点的所构成树的最大深度就是寻求其左右子树的最大深度较大的那个 加上root的这一层深度,也就是加1;具体看代码。代码:import java.lang.Math;class Solution { publ...原创 2019-12-14 15:21:52 · 131 阅读 · 0 评论 -
【LeetCode】(简单)100.相同的树
做了这么多题,看到题总得会提炼条件、输出,就做对了一半。条件:1.树的结构相同 2.每个结点对应的值也相同输出: true 或者 false首先吧,树类型的题一定先去用递归思考。因为树的结构问题,它的左右子树又可以被看作一颗独立的树。递归跳出条件:当两个树都是空结点时,说明遍历到了树的叶子节点。成立条件:1.两棵树都不为空 2.根节点的值相等不满足成功条件的就是返回false...原创 2019-08-27 22:20:09 · 99 阅读 · 0 评论 -
【LeetCode】(简单)206.反转链表
我之前把它刷过两遍,遇到后又有点懵……随即我打算记录一下我的思路。首先有三个指针完成:dummyHead—始终指向链表头部(一开始创建作为虚拟头节点,以防空指针)pre—主要记录下一次要旋转的结点的前一个结点的位置cur—主要记录这次要插到dummyHead位置的结点他们的位置在每次迭代前后都必须是dummyHead—pre—cur核心代码:pre.next = cur.next...原创 2019-08-26 22:18:32 · 100 阅读 · 0 评论 -
【LeetCode】(简单)290.单词规律
技术:java+hashMap这道题说的是对应关系,那首先想到的集合就是Map是要将key(a)-value(dog)存在一起,每当遇到一个字母就去查看对应的单词。map< 字母 , 单词>成功:1.key存在,查看key对应的value和当前的单词是否对应。2.key不存在,在value中查找单词,没查到的情况下,存下对应关系。失败:1.key存在,经过查找字母...原创 2019-08-26 19:09:31 · 250 阅读 · 0 评论