- 博客(463)
- 资源 (2)
- 收藏
- 关注
原创 106. 从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
2022-06-30 11:19:51
386
原创 678. 有效的括号字符串
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:示例 2:示例 3:二、解题两次遍历正反遍历,从左往右遍历,确定右括号,从右往左遍历,确定左括号。时间复杂度:O(n)空间复杂度:O(1)从左到右遍历字符串,遍历过程中,未匹配的左括号数量可能会出现如下变化:如果遇到左括号,则未匹配的左括号数量加 1;如果遇到右括号,则需要有一个左括号和右括号匹配,因此未匹配的左括号数量减 1;如果遇到星号,由于星号可以看成左括号、右括号或
2022-06-30 09:41:48
488
原创 442. 数组中重复的数据
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。示例 2:示例 3:二、解题一次遍历正负号判断法,出现过的数字就数字取反,然后判断是否取反过。时间复杂度:O(n)空间复杂度:O(1)。...
2022-06-29 20:41:22
166
原创 611. 有效三角形的个数-排序+二分查找
给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。示例 2:二、解题排序+二分查找abc三条边从小到大排序,构成三角形的条件是a+b>c,如果大于c,说明是三角形,否则不是时间复杂度:O(n^2)空间复杂度:O(logn)。...
2022-06-14 10:56:01
336
原创 剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树:示例 1:示例 2:二、解题递归分治二叉搜索树的后序遍历:最后一个值是根节点,根节点的左子树的值是小于根节点的值,右子树是大于根节点的值,所以使用递归分治算法,从左往右找到第一个大于根节点的值,分割为左右两个子树。分割点为cur,[left,cur-1]小于根节点,[cur,right-1]大于根节点,只需要判断[cur,r
2022-06-14 10:06:21
122
原创 7. 整数反转-数学
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)示例 2:示例 3:示例 4:二、解题数学这题需要判断是否溢出时间复杂度:O(log∣x∣)。翻转的次数即 x 十进制的位数。空间复杂度:O(1)。...
2022-06-13 22:15:41
258
原创 863. 二叉树中所有距离为 K 的结点-DFS
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。示例 2:二、解题DFS记录每个节点的父节点,然后从target节点开始dfs,找到所有和target节点距离为k的节点,向三个方向寻找。1.左子树 2.右子树 3.向父节点查找时间复杂度:O(n),其中 n 是二叉树的结点个数。空间复杂度:O(n)。......
2022-06-13 16:39:46
202
原创 剑指 Offer 11. 旋转数组的最小数字-二分查找
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。示例 2:二、解题二分查找
2022-06-12 22:30:01
119
1
原创 120. 三角形最小路径和-动态规划
给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。示例 2:二、解题动态规划1、状态定义:dp[i][j] 表示从点 (i, j)(i,j) 到底边的最小路径和。2、状态转移:dp[i][j] = min(dp[i + 1][j], dp[i +
2022-06-12 22:04:54
90
原创 556. 下一个更大元素 III-(31. 下一个排列)-两次遍历
给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1 。示例 2:二、解题两次遍历这题类似于31题下一个排列,只不过这里出现的是给一个正整数,31题是一个数组,所以需要将正整数变为字符数组即可。...
2022-06-11 11:50:00
104
原创 34. 在排序数组中查找元素的第一个和最后一个位置-二分查找、双指针
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:示例 2:示例 3:二、解题二分查找这题进阶需要O(log(n))的时间复杂度,所以就想到二分查找,如果在一个升序的不重复的数组中找一个目标数字比较好写,这里的数组的数字是重复的,所以可以分为找目标值在数组中第一次出现的位置,然后在找第二次出现的位置,然而第二次出现的位置可以转为目标值+1在数组中出现第一次的位置,
2022-06-10 11:14:16
142
原创 62. 不同路径-动态规划
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 2:示例 3:示例 4:二、解题动态规划总共多少路径: dp[i][j] = dp[i-1][j] + dp[i][j-1];扩展 : 最短路径: dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])+1;...
2022-06-09 10:48:01
136
原创 662. 二叉树最大宽度-BFS
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与**满二叉树(full binary tree)**结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。这个二叉树与满二叉树结构相同,所以我们将这个二叉树重新赋值,然后计算二叉树的节点值,使用双端队列,队尾元素减队头元素获取最大长度!...
2022-06-08 09:40:13
209
原创 112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。示例 2:示例 3:二、解题回溯判断是否为叶子节点,如果是叶子节点则判断当前值是否为targetSum。......
2022-06-06 10:26:48
174
原创 268. 丢失的数字-异或
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。示例 2:示例 3:示例 4:二、解题异或0 ^ 4 = 44 ^ 4 = 0我们可以先求得 [1, n][1,n] 的异或和 ansans,然后用 ansans 对各个 nums[i]nums[i] 进行异或。这样最终得到的异或和表达式中,只有缺失元素出现次数为 11 次,其余元素均出现两次(x ⊕x = 0x⊕x=0),即最终答案 ansans 为缺失元素。...
2022-06-03 22:24:31
251
原创 54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 2:二、解题模拟按上下左右进行模拟,然后判断是否越界时间复杂度:O(n);空间复杂度:O(n)。
2022-06-01 22:32:02
123
原创 https,udp,socket区别
创建socket连接时,可以指定使用的传输层协议,socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该socket连接就是一个TCP连接。socket连接一旦建立,通信双方即可开始相互发送数据内容, 直到双方连接断开。注意,同HTTP不同的是http只能基于tcp,socket不仅能走tcp,而且还能走udp,这个是socket的第一个特点。HTTP连接使用的是“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务端才能回复数据。很多情况下
2022-06-01 10:53:34
862
原创 Http 与 Https 的区别
HTTPS协议HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之
2022-05-31 11:16:51
451
原创 Handler 机制和原理-Android
handler主要包含 Looper,MessageQueue,Message 和 Handler。Looper:它在消息机制里是用来把普通线程转成looper线程的(Looper.prepare()),并担当消息循环的任务,当然,UI 线程是通过Looper.PrepareMainLoper()。它会开启无限循环(Loper.loop())并不停的从 MessageQueue 中查看是否有新消息,如果有就拿出来处理,如果没有呢,就阻塞(其实真正的阻塞在 MessageQueue 的 next 里)。L
2022-05-29 21:57:03
374
原创 子线程是否可以更新UI-Android
Android 中子线程在满足一定的条件下可以更新 UI。首先说一下抛出异常at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7905)@Overridepublic void requestLayout() { if (!mHandlingLayoutInLayoutRequest) { checkThread(); mLayoutRequested = true;
2022-05-29 17:24:28
1432
原创 Activity.runOnUiThread介绍-Android
Android中我们不在子线程中操作UI,但是如果非要在子线程中操作完后实现对UI操作,这里的实现方法如下:mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { // 子线
2022-05-29 16:57:52
303
原创 AsyncTask-Android
Android如果要执行耗时操作,则必须方法子线程中执行。除了Thread可以开启子线程外,Android中扮演线程角色的有很多。AsyncTask是一个执行异步任务的类,底层是采用线程池实现的。AsyncTask是一个抽象类,它是由Android封装的一个轻量级异步类(轻量体现在使用方便、代码简洁),它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。作用:实现多线程:在工作线程中执行任务,如耗时任务异步通信、消息传递:实现工作线程 & 主线程(UI
2022-05-29 16:33:40
176
原创 IntentService-Android
IntentService 是 Service 的子类,继承于 Service 类,用于处理后台异步请求任务。用于处理后台长时间的耗时操作,如:下载文件、播放音乐。用完自动结束。如果是普通的Service ,需要使用stopSelf()。使用方法IntentService 是抽象类,所以在实际使用中,我们需要创建一个 IntentService 子类来具体实现创建 IntentService 子类,并在清单文件中注册。在 Activity 中通过调用 startService(Intent) 方法
2022-05-29 10:58:09
165
原创 HandlerThread使用-Android
handlerThread是内部有一个looper轮询器的Thread线程。HandlerThread,是一个具有Looper的线程,这个Looper可以用于创建Handler;另外start()必须执行,因为Handler毕竟是个Thread,调用start()会走到run()中,而HandlerThread恰恰是在run中创建的Looper。HandlerThread产生的背景:google为了避免以下几种情况,给android开发者提供了这样一个异步框架:在需要做子线程耗时操作时,我们有可能会
2022-05-28 16:17:56
1172
原创 ContentProvider ContentResolver ContentObserver关系-Android
ContentProvider四大组件的内容提供者,主要用于对外提供数据实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等一个应用实现ContentProvider来提供内容给别的应用来操作,通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以ContentResolver内容解
2022-05-27 16:55:21
207
原创 Intent传输数据大小限制-Android
Intent传输数据的大小受Binder的限制,上限是1M。不过这个1M并不是安全的上限,Binder可能在处理别的工作,安全上限是多少这个在不同的机型上也不一样。Intent 传输数据的机制中,用到了 Binder。Intent 中的数据,会作为 Parcel 被存储在 Binder 的事务缓冲区(Binder transaction buffer)中的对象进行传输。而这个 Binder 事务缓冲区具有一个有限的固定大小,当前为 1MB。你可别以为传递 1MB 以下的数据就安全了,这里的 1MB 空间
2022-05-27 16:47:15
4538
原创 onNewIntent使用-Android
standard默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中,永远不会调用onNewIntent()。singleTop如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,并调用其onNewIntent(),否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例,而不会调用onNewIntent(),此时就跟standard模式一样)。singleTask如果在任务栈中已经有该Activity..
2022-05-27 16:24:59
579
原创 Activity生命周期-切换横竖屏-Android
创建一个项目,测试横竖屏切换的时候生命周期的变换ScreenActivity.javapublic class ScreenActivity extends AppCompatActivity { private static final String TAG = "ScreenActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sav
2022-05-27 15:33:11
492
原创 ContentProvider内容提供者-Android
ContentProvider 应用程序间非常通用的共享数据的一种方式,也是 Android 官方推荐的方式。封装。对数据进行封装,提供统一的接口,使用者完全不必关心这些数据是在 DB ,XML 、Preferences 或者网络请求来的。当项目需求要改变数据来源时,使用我们的地方完全不需要修改。提供一种跨进程数据共享的方式。应用程序间的数据共享还有数据更新通知机制。因为数据是在多个应用程序中共享的,当其中一个应用程序改变了这些共享数据的时候,它有责任通知其它应用程序,让它们知道共享数据被修改了,这
2022-05-27 10:50:17
202
原创 Service保活
实现APP挂后台一直存活不会被系统杀掉进程,这也就是常说的service保活。实现方案onStartCommand方法,返回START_STICKY提升Service优先级在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。提升Service进程优先级,比如改为前台进程Android中将进程分成6个等级,由高到低分别是:前台进程、
2022-05-26 22:11:13
667
1
原创 Intent与IntentFilter-Android
Intent是信息的载体,用它可以去请求组件做相应的操作,Intent促进了组件之间的交互,做为消息的载体,去指导组件做出相应的行为,Intent可以携带数据,传递给Activity/Service/BroadcastReceiver。启动Activity。Activity可以简单的理解为手机屏幕中的一个页面,你可以通过将Intent传入startActivity方法来启动一个Activity的实例,也就是一个页面,同时,Intent也可以携带数据,传递给新的Activity。如果想要获取新建的Acti
2022-05-26 21:15:39
204
原创 Service服务-Android
Service既不是一个线程,Service通常运行在当成宿主进程的主线程中,所以在Service中进行一些耗时操作就需要在Service内部开启线程去操作,否则会引发ANR异常。也不是一个单独的进程。除非在清单文件中声明时指定进程名,否则Service所在进程就是application所在进程。Service默认线程为UI线程,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作。一、用法1、启动方式:startService()bindService.
2022-05-26 16:55:35
122
原创 Context面试-Android
Context 也就是上下文对象,是 Android 常用的类。我们常用的 Activity,Service 和 Application 都间接的继承了 Context。Context 是一个抽象类。日常开发中,使用 Context 的地方数不胜数,比如像弹 Toast、创建 Dialog、创建自定义 View 等等时候都需要传入 Context 对象,还有像启动 Activity、Service、访问资源和获取系统服务等等,都离不开 Context。它允许访问特定于应用程序的资源和类,以及对应用程序级操
2022-05-26 10:25:20
219
原创 Broadcast广播-Android
一、Broadcast1、定义在 Android 中,Broadcast 是一种在应用程序之间传输信息的机制,要发送的广播内容是一个 Intent,这个 Intent 中可以携带我们要传送的数据。(数据小于1MB)普通广播Normal Broadcast:异步执行的广播,所有接收者在同一时刻收到这条广播消息。效率高,没有先后顺序,无法截断。属于全局广播。调用 sendBroadcast()发送,最常用的广播。有序广播Ordered Broadcast:同步执行的广播,发出去的广播会被广播接收
2022-05-25 15:07:01
1063
1
原创 Android启动模式LaunchMode的应用场景
LaunchMode 有四种,分别为 Standard,SingleTop,SingleTask 和 SingleInstance,每种模式的实现原理一楼都做了较详细说明,下面说一下具体使用场景:Standard:Standard 模式是系统默认的启动模式,一般我们 app 中大部分页面都是由该模式的页面构成的,比较常见的场景是:社交应用中,点击查看用户A信息->查看用户A粉丝->在粉丝中挑选查看用户B信息->查看用户A粉丝… 这种情况下一般我们需要保留用户操作 Activity 栈的
2022-05-24 21:54:45
588
1
原创 Activity 与 Fragment通信方式-Android
Fragment 与 Activity 通信存在三种情形:Activity 操作内嵌的 FragmentFragment 操作宿主 ActivityFragment 操作同属 Activity中的其他 FragmentFragment 与 Activity 通信方式:Bundle接口回调广播EventBusHandlerViewModel一、Bundle1、Activity 传递数据到 Fragmentactivity_main.xml<?xml ver
2022-05-24 21:36:23
1207
原创 450. 删除二叉搜索树中的节点-递归
一、题目描述给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例 1:输入:root = [5,3,6,2,4,null,7], key = 3输出:[5,4,6,2,null,null,7]解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。一个正确的答案是
2022-05-23 10:46:30
219
原创 单例模式-设计模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。构造函数是私有的。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。1、饿汉式是否 Lazy 初始化:否是否多线程安全:是实现难度:
2022-05-22 20:52:25
79
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人