![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
Richange233
这个作者很懒,什么都没留下…
展开
-
429. N 叉树的层序遍历
和二叉树的层序遍历思路一致,只不过有些许不同,二叉树需要判断左右孩子是否存在,N叉数则需要判断其孩子列表是否存在,如果存在则将其孩子全部加到队列当中,其余思路和102题一样。class Solution { public List<List<Integer>> levelOrder(Node root) { Queue<Node> queue = new ArrayDeque<>(); List<List<原创 2022-04-13 13:44:53 · 529 阅读 · 0 评论 -
102.二叉树的层序遍历
层序遍历从左到右一层一层的去遍历二叉树,用队列来实现,队列先进先出,符合一层一层遍历的逻辑。题目要求按层分开,所以可以在遍历某一层的时候先记录这一层有多少个结点,这样就能实现结点分层。class Solution { public List<List<Integer>> levelOrder(TreeNode root) { Queue<TreeNode> queue = new ArrayDeque<>(); Lis原创 2022-04-13 13:11:50 · 799 阅读 · 0 评论 -
347.前 K 个高频元素
一、自己的解法:使用了Map哈希表,遍历数组统计出现的频率对Map按Value的值进行排序,借用比较器进行降序排序。输出前k个数的key值。lass Solution { public int[] topKFrequent(int[] nums, int k) { Map<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++)原创 2022-04-12 14:44:05 · 252 阅读 · 0 评论 -
28. 实现 strStr()
思路:1.两个字符串分别定义一个从头开始的指针,并且同时从左向右遍历字符串。2.如果发现两个指针指向的字符是相同,则flagflagflag记录当前的left值,继续同时向右遍历,如果直到needleneedleneedle遍历结束,都相同,则说明存在haystackhaystackhaystack存在needleneedleneedle,则flagflagflag值就是首先出现的索引位置。如果在needleneedleneedle遍历结束前发现存在不同的字符,则left指针重新指向flag+1flag原创 2022-04-05 14:25:15 · 270 阅读 · 0 评论 -
151.翻转字符串里的单词
如果用split 还是比较好做的,但是显然这是不可取的。双指针法思路:1.移除多余空格2.将整个字符串反转3.将每个单词反转class Solution {// 作用 将目标区间的单词反转 public void reverseString(StringBuilder sb,int left,int right) { while (left < right){ char temp = sb.charAt(le原创 2022-04-03 15:17:06 · 69 阅读 · 0 评论 -
541. 反转字符串II
思路:这个题只要让for循环i 每次移动 2 * k 就可以找到2k长度的区间,找到之后然后进行规则判定进行反转。遇到固定长度区间的题目,可以考虑for循环中做相应的长度变化。class Solution { public char[] reverseString(char[] s,int left,int right) { while (left < right){ char temp = s[left]; s[left]原创 2022-04-03 12:16:21 · 116 阅读 · 0 评论 -
344.反转字符串
思路:1.定义双指针,分别指向数组开始和结尾2.循环,每次交换两个指针指向的字符,即可完成反转。class Solution { public void reverseString(char[] s) { int left = 0; int right = s.length - 1; while (left < right){ char temp = s[left]; s[left] = s[原创 2022-04-03 11:09:29 · 53 阅读 · 0 评论 -
18. 四数之和
这个题目和15.三数之和的思路基本一致,不过是再嵌套一个for循环,两个for循环指定两个加数,双指针寻找另外两个加数。要注意第二个for循环中if(j > i+1 &&nums[j]==nums[j-1]) continue;只能j>i+1。刚开始想的是大于1,这样会导致第一层循环i大于等于1的时候,由于j=i+1,条件判定直接为真,导致丢失结果。class Solution { public List<List<Integer>> fourS原创 2022-04-02 17:16:47 · 54 阅读 · 0 评论 -
第15题. 三数之和
这个题目想到了用双指针来做,但是自己想出来的方法在通过倒数第三个示例时发生了超时,因为用了3个循环,造成了超时。迫不得已看了解答,属实没想到可以直接对数组进行排序这个操作,涨了经验了- -。思路:对数组进行排序,返回一个有序数组。for循环遍历数组,left指针指向i+1位置,right指向数组最后位置,如果nums[i]大于0,且由于是有小到大排序,说明之后的和一定无法等于0,直接返回就可以。如果nums[i] + nums[left] + nums[right] > 0,则说明值过大,把r原创 2022-04-02 16:26:48 · 64 阅读 · 0 评论 -
383. 赎金信
使用数组来做这个题目,思路和242.有效的字母异位词 题目类似。思路:1.显然,如果ransomNote的长度大于Magazine的长度,肯定无法满足题目要求,则必定返回false,也就是说ransomNote.length() <= magazine.length()才可以满足题目要求。2.创建一个长度为26位的数组result,用来保存每个字母出现的次数。3.遍历可能长度更长的magazine字符串和ransomNote字符串的字符,magazine每次出现的字符都减少一,ransomNo原创 2022-04-02 14:11:34 · 54 阅读 · 0 评论 -
第454题.四数相加II
知道应该用哈希表,但是刚开始确实是没想明白该怎么做,其实也是很简单的。思路:1.把四个数组,分成两组,前两个和后两个共两组,遍历数组,把每组内的元素全部加和,并把加和后的值作为key分别保存在两个哈希map中,value为这个和出现的次数。2. 遍历其中一个哈希map1,得到每一个元素的key和value, 判断0 - 当前元素key 是否存在于另一个哈希map2中。然后两个value值相乘即可得到一次的组合数。例如:得到的key值为-1,value为3,也就是说前两个数组中,相加等于-1的组合共有3原创 2022-04-01 17:32:35 · 133 阅读 · 0 评论 -
1. 两数之和
1. 两数之和排除暴力解法,采用map的解法:map的key值为元素值,value为在数组中的索引。思路:1.遍历一遍数组,查看target - 当前元素值是否在map中存在,如果存在在返回当前遍历的数组索引和得到的map的value值2. 不存在则将当前元素按<元素值,索引>的形式保存在map中。class Solution { public int[] twoSum(int[] nums, int target) { HashMap<Integer,原创 2022-04-01 16:24:42 · 55 阅读 · 0 评论 -
202. 快乐数
202. 快乐数思路:1.将数字变成字符串,方便对每个位置的数进行平方加和。2.对每个位置的数进行平方后加和。3.由于可能无限循环,也就是说我们可以看看得到的sum值是否曾经出现过,如果曾经出现过说明进入了一个环,也就是无限循环,直接return false就可以。class Solution { public boolean isHappy(int n) { int sum = n; HashSet<Integer> set = new Has原创 2022-04-01 15:51:53 · 55 阅读 · 0 评论 -
349. 两个数组的交集
349. 两个数组的交集set解法:之前基本没有用过set这个东西,一时间想不起来。两种方法在letcode中的耗时和空间消耗基本一致。自己的解答思路:遍历某一个数组,将该数组的所有值都保存在一个map中,并将值置为1;然后遍历第二个数组,如果查找map中的key得到值不为null,说明这个数在第一个数组中有,把他保存在一个列表中。最后将列表的存储的相同值保存到返回数组中。class Solution { public int[] intersection(int[] nums1, int[]原创 2022-04-01 15:15:51 · 70 阅读 · 0 评论 -
242. 有效的字母异位词
242. 有效的字母异位词因为题目说的是小写字母,因为全部小写字母为26为,定义一个长度为26位的数组,用来记录每个字母出现的次数。首先判断两个字符串是否长度相同,长度不同的话肯定是false。之后遍历两个字符串,读取s字符串的时候每个字符的记录加一,读取t字符串的时候每个记录减一,当遍历完成后,若出现次数相同则数组的所有值应该都为0.class Solution { public boolean isAnagram(String s, String t) { if(s.leng原创 2022-04-01 13:18:25 · 54 阅读 · 0 评论 -
142. 环形链表 II
142. 环形链表 II这个方法实在是想不到,只会个笨方法。用了Map来标记某一个结点是否被访问过,当再次访问某个已经被访问的结点的时候,说明这个节点是环的入口,但是对空间有所消耗。public class Solution { public ListNode detectCycle(ListNode head) { HashMap<ListNode, Boolean> map = new HashMap<>(); ListNode lef原创 2022-03-31 17:23:19 · 77 阅读 · 0 评论 -
面试题 02.07. 链表相交
面试题 02.07. 链表相交一定要注意是结点相同,而不是数值相同。public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode newA = new ListNode(0,headA); ListNode newB = new ListNode(0,headB); ListNode left = head原创 2022-03-31 16:15:54 · 980 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
暴力解法,两次遍历,第一次遍历结点个数,第二次删除结点。class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { int count = 1; ListNode listNode = new ListNode(0,head); while (head.next!=null){ count++; head = h原创 2022-03-31 11:47:34 · 254 阅读 · 0 评论 -
24. 两两交换链表中的节点
这个题目就是按部就班的做就行了,加一个新的头结点会更加方便操作。while停止的条件要注意。class Solution { public ListNode swapPairs(ListNode head) { ListNode new_head = new ListNode(0,head); ListNode pre = new_head; while (pre.next != null && pre.next.next !=原创 2022-03-31 11:19:36 · 225 阅读 · 0 评论 -
206. 反转链表
翻转链表,考虑为倒序插入一个新链表实现翻转效果。class Solution { public ListNode reverseList(ListNode head) { ListNode p = new ListNode(0,null); ListNode q = head; while (head != null){ head = head.next; q.next = p.next;原创 2022-03-30 16:31:18 · 615 阅读 · 0 评论 -
707. 设计链表
单链表做法,按部就班完成即可,size 这个标记非常关键。class MyLinkedList { ListNode head; int size = 0; public MyLinkedList() { size = 0; head = new ListNode(0); } public int get(int index) { System.out.println(size); if(原创 2022-03-30 16:30:02 · 39 阅读 · 0 评论 -
203. 移除链表元素
构建一个新的头结点,然后执行结点删除。class Solution { public ListNode removeElements(ListNode head, int val) { ListNode p = new ListNode(); ListNode q = p; while (head != null){ if(head.val != val) { q..原创 2022-03-30 15:44:21 · 300 阅读 · 0 评论 -
59.螺旋矩阵II
class Solution { int num = 1; public int[][] ge(int[][] result,int n,int count){// 生成上方数据 for (int i = count; i < n; i++) { result[count][i] = num++; }// 生成右侧数据 for (int i = count; i < n; .原创 2022-03-30 14:33:10 · 128 阅读 · 0 评论 -
209. 长度最小的子数组
class Solution { public int minSubArrayLen(int target, int[] nums) { int left =0; int sum = 0; int temp = 0; int min = 0; while (left != nums.length ){ sum = 0; temp = 0; for (int .原创 2022-03-29 18:48:40 · 118 阅读 · 0 评论 -
977.有序数组的平方
class Solution { public int[] sortedSquares(int[] nums) { int temp = 0; for (int i = 0; i < nums.length; i++) { nums[i] = nums[i] * nums[i]; } for (int i = 0; i < nums.length-1; i++) { for (in.原创 2022-03-29 17:15:04 · 75 阅读 · 0 评论 -
27. 移除元素
class Solution { public int removeElement(int[] nums, int val) { int flag = 0; for (int i = 0; i < nums.length; i++) { if(nums[i] == val){ continue; } else { nums[fl.原创 2022-03-25 21:23:01 · 53 阅读 · 0 评论 -
704. 二分查找
class Solution { public int search(int[] nums, int target) { int left = 0; int right = nums.length - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) { .原创 2022-03-25 20:52:42 · 81 阅读 · 0 评论