热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaEra:力扣刷题记录

目录79.WordSearch48.RotateImage23.MergekSortedLists56MergeIntervals72EditDistance78Subsets10

目录

    • 79. Word Search
    • 48. Rotate Image
    • 23. Merge k Sorted Lists
    • 56 Merge Intervals
    • 72 Edit Distance
    • 78 Subsets
    • 102. Binary Tree Level Order Traversal
    • 105. Construct Binary Tree from Preorder and Inorder Traversal
    • 406. Queue Reconstruction by Height
    • 437. Path Sum III
    • 103. Binary Tree Zigzag Level Order Traversal
    • 1269. Number of Ways to Stay in the Same Place After Some Steps
    • 912. Sort an Array
    • 189. Rotate Array
    • 145. Binary Tree Postorder Traversal
    • 142. Linked List Cycle II


79. Word Search

掌握C语言中二维指针的定义(不定长度二维数组传参需要使用):

int** visited &#61; malloc(sizeof(int*) * boardSize);for (int i &#61; 0; i < boardSize; i&#43;&#43;) {visited[i] &#61; malloc(sizeof(int) * boardColSize[0]);memset(visited[i], 0, sizeof(int) * boardColSize[0]);}

48. Rotate Image

四个变量a, b, c, d, a赋值给b&#xff0c;b给c&#xff0c;c给d&#xff0c;d给a&#xff0c;只需要一个临时变量。

23. Merge k Sorted Lists

Java中优先队列的用法&#xff08;本质是堆排序&#xff0c;每次维护堆消耗logn时间&#xff09;&#xff1a;

class Status implements Comparable<Status> {int val;ListNode ptr;Status(int val, ListNode ptr) { //Status这个对象自己定义&#xff0c;本题中为链表结点this.val &#61; val;this.ptr &#61; ptr;}public int compareTo(Status status2) {return this.val - status2.val;}}PriorityQueue<Status> queue &#61; new PriorityQueue<Status>(); //初始化queue.offer(new Status(node.val, node)); //入队Status f &#61; queue.poll(); //出队 注意这里的f就是队里的结点&#xff08;没有new&#xff09;&#xff0c;本题是就地建堆

定义和初始化更简洁的写法&#xff1a;

Queue<ListNode> pq &#61; new PriorityQueue<>((v1, v2) -> v1.val - v2.val); //优先队列元素即为链表结点&#xff0c;比较条件使用lambda表达式

56 Merge Intervals

Java中可实现堆栈的双端队列用法&#xff1a;

Deque deque &#61; new LinkedList();

队列操作&#xff1a;addLast(e)&#xff0c;removeFirst()&#xff0c;peekFirst()
栈操作&#xff1a;addFirst(e)&#xff0c;removeFirst()&#xff0c;peekFirst()

72 Edit Distance

二维动态规划基本操作&#xff1a;

  1. 定义长宽分别为m&#43;1、n&#43;1的二维数组&#xff1b;
  2. 第0行与第0列分别初始化&#xff1b;
  3. 1-m, 2-n 填表

78 Subsets

dfs循环时一定不要忘记恢复初始状态。如果考虑是否跳过当前元素&#xff0c;可以不使用循环&#xff0c;更简单。

102. Binary Tree Level Order Traversal

广度优先搜索时&#xff0c;为了判断当前在第几层&#xff0c;可每层使用一次for循环&#xff0c;循环次数为开始时队列的长度&#xff0c;即当前层的节点数。
注意&#xff1a;循环条件不能是从0到队列长为止&#xff0c;因为队列长度在变化。可以用一个变量记录下当前队列长&#xff0c;或者从队列长递减到0。

105. Construct Binary Tree from Preorder and Inorder Traversal

Java中哈希的使用&#xff1a;

private Map<Integer, Integer> indexMap;
indexMap &#61; new HashMap<Integer, Integer>();
indexMap.put(key, value);
int value&#61; indexMap.get(key);
int value&#61; indexMap.getOrDefault(key, -1);

406. Queue Reconstruction by Height

数组排序重写&#xff1a;

Arrays.sort(people, new Comparator<int[]>() { //多态指明类型&#xff0c;否则需要在compare()中强制类型转换public int compare(int[] person1, int[] person2) {if (person1[0] !&#61; person2[0]) {return person2[0] - person1[0]; //降序} else {return person1[1] - person2[1]; //升序}}});

1482. Minimum Number of Days to Make m Bouquets补充&#xff1a;如何对int数组排序&#xff1f;
直接使用Arrays.sort(a,Collections.reverseOrder());&#xff1b;
自己重写Comparator&#xff0c;数组必须为Integer对象数组才行&#xff01;
补充&#xff1a;其实这也得是对象数组。int降序要么转为integer&#xff0c;要么升序再颠倒

Java ArrayList toArray() 方法的语法为&#xff1a;

arraylist.toArray(T[] arr)
T [] arr&#xff08;可选参数&#xff09;- 用于存储数组元素的数组
如果参数 T[] arr 作为参数传入到方法&#xff0c;则返回 T 类型的数组&#xff08;否则Object型&#xff09;

349. Intersection of Two Arrays补充&#xff1a;Integer类型的ArrayList不能使用toArray()转成int []&#xff0c;只能循环。
可以先声明一个长数组&#xff0c;再使用Arrays.copyOfRange(T[ ] original,int from,int to);实现数组复制去除多余的零元素。

437. Path Sum III

List元素修改函数为&#xff1a;arraylist.set(int index, E element)
无论是使用for迭代还是get()得到的元素都不能直接赋值修改。

103. Binary Tree Zigzag Level Order Traversal

假设有以下代码&#xff1a;

List<Integer> slist&#61;new ArrayList();
slist.add(1);
List<List<Integer>> list&#61;new ArrayList();
list.add(slist);
slist&#61;new ArrayList();

那么问题来了&#xff0c;list中第一个元素是空列表还是包含“1”的列表&#xff1f;
实际上是包含“1”的列表&#xff0c;因为Java的集合类的元素是对象引用&#xff0c;但注意slist本身也只是引用&#xff0c;真正在list.add(slist)添加的引用是第一行的new ArrayList()&#xff1a;
在这里插入图片描述
参考Java中list存放的是值还是对象的引用问题

1269. Number of Ways to Stay in the Same Place After Some Steps

动态规划&#xff0c;两个数组交替运行下面的语句&#xff1a;

nw[j]&#61;od[j]&#43;od[j-1]&#43;od[j&#43;1];

题目中温馨提示&#xff1a;

Since the answer may be too large, return it modulo 10^9 &#43; 7.

如果不做任何处理&#xff0c;数组元素不断达到231−12^{31}-12311然后负溢出。处理也很简单&#xff0c;因为题目计算只有加法&#xff0c;所以在计算的时候不断模109&#43;710^{9}&#43;7109&#43;7就可以了。
109&#43;710^{9}&#43;7109&#43;7是接近于int表示最大正数的一个大质数&#xff0c;这个数的两倍还在int表示范围内&#xff0c;三倍就会溢出。如果我们把该语句改成

nw[j]&#61;(od[j]%m&#43;od[j-1]%m&#43;od[j&#43;1]%m)%m; //m&#61;1000000007

是否就可以了呢&#xff1f;答案是否定的。od[j]%m这一步没有必要&#xff0c;因为我们计算时已经保证od数组都不会大于m&#xff1b;od[j]%m&#43;od[j-1]%m&#43;od[j&#43;1]%m这一步反而是有可能溢出的&#xff0c;如果这三个元素都比较接近m的话。由于两个m相加不会溢出&#xff0c;所以应该改成&#xff1a;

nw[j]&#61;((od[j]&#43;od[j-1])%m&#43;od[j&#43;1])%m;

912. Sort an Array

堆排序要点&#xff1a;
左子节点、右子节点分别为

int lson &#61; (i << 1) &#43; 1;int rson &#61; (i << 1) &#43; 2;

循环条件是左子节点存在&#xff0c;循环内部取右子节点值时需要判断是否超范围&#xff1b;
要使结果为正序&#xff0c;需要建立大根堆&#xff0c;不断把根放最后&#xff1b;
调整堆参数要包括起止点。

189. Rotate Array

最大公约数求法&#xff1a;

public int gcd(int x, int y) {return y > 0 ? gcd(y, x % y) : x;}

145. Binary Tree Postorder Traversal


  1. 使用两个栈辅助。主栈不断弹出一个节点存入辅栈&#xff0c;再压入左右非空子节点&#xff0c;这样访问顺序为右子树→左子树→父节点&#xff0c;辅栈倒过来就对了&#xff1a;

public class Test{Stack<TreeNode> stack1 &#61; new Stack<TreeNode>();Stack<TreeNode> stack2 &#61; new Stack<TreeNode>();public void postOrder(TreeNode root){stack1.push(root);while(!stack1.isEmpty()){TreeNode pop &#61; stack1.pop();stack2.push(pop);if(pop.left!&#61;null)stack1.push(pop.left);if(pop.right!&#61;null)stack1.push(pop.right);}while(!stack2.isEmpty()){System.out.println(stack2.pop().val&#43;" ");}}

  1. 使用一个集合存储第一次回溯遇到的父节点&#xff08;或使用标志位&#xff09;&#xff1a;

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans &#61; new ArrayList<>();Stack<TreeNode> s &#61; new Stack<>();Set<TreeNode> seen &#61; new HashSet<>();while (root !&#61; null || !s.isEmpty()) {if (root &#61;&#61; null && seen.contains(s.peek())) {ans.add(s.pop().val);} else if (root &#61;&#61; null) {seen.add(s.peek());root &#61; s.peek().right;} else {s.push(root);root &#61; root.left;}}return ans;}
}

  1. 只需要一个栈和一个辅助节点prev&#xff0c;不断向左遍历压栈&#xff0c;到头不断向右遍历压栈&#xff0c;到头记录并更新prev&#xff0c;从而根据root.right &#61;&#61; prev判是否为第二次回到root&#xff1a;

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res &#61; new ArrayList<Integer>();if (root &#61;&#61; null) {return res;}Deque<TreeNode> stack &#61; new LinkedList<TreeNode>();TreeNode prev &#61; null;while (root !&#61; null || !stack.isEmpty()) {while (root !&#61; null) {stack.push(root);root &#61; root.left;}root &#61; stack.pop();if (root.right &#61;&#61; null || root.right &#61;&#61; prev) {res.add(root.val);prev &#61; root;root &#61; null; //Attention!} else {stack.push(root);root &#61; root.right;}}return res;}
}

142. Linked List Cycle II

在这里插入图片描述

关键在于2(a&#43;b)&#61;a&#43;b&#43;n(b&#43;c)⟹a&#61;c&#43;(n−1)(b&#43;c)2(a&#43;b)&#61;a&#43;b&#43;n(b&#43;c)⟹a&#61;c&#43;(n−1)(b&#43;c)2(a&#43;b)&#61;a&#43;b&#43;n(b&#43;c)a&#61;c&#43;(n1)(b&#43;c)&#xff0c;这里把a放到等式一端&#xff0c;就能看出来所求的头节点到入环点的距离与相遇点到入环点的距离差了整环长的倍数。


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
author-avatar
今日屎汰濃
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有