leetcode
文章平均质量分 53
m_iNoError
这个作者很懒,什么都没留下…
展开
-
leetcode——Iterator 使用思考(仅单线程安全remove 方法、多线程下对 iterator 遍历加锁)
今天在做剑指 Offer 38. 字符串的排列时,视图利用 map 保存字符与字符个数的映射关系,然后取 map 的 key 集合(map.getSet),对 set 进行遍历时对value 为0的值直接用 map.remove(c)进行删除,结果爆出了 ConcurrentModificationException。猜想原因应该是:遍历的对象是利用 getSet 方法获取的 Set 类型引用,这些引用指向的是 map 中的地址,而不是又新建了一个 Set 对象,因此问题相当于:遍历 Set 引用的时.原创 2021-04-28 22:41:54 · 1517 阅读 · 0 评论 -
leetcode——思考——Collections.reverse、RandomAccess(原创)
今天做了剑指 Offer 32 - III. 从上到下打印二叉树 III(https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/),利用常规的标志位设置奇偶层,根据标志位决定每个元素(对每个元素都要判断一次)是添加在r 的末尾,还是添加在头部。(时间29%)发现时间效率低,查看了题解发现可以:(1)都添加在末尾(2)最后进行标志位判断,使用 Collections.reverse对 r整体倒置,从而减原创 2021-04-27 11:09:52 · 395 阅读 · 0 评论 -
剑指Offer——13机器人的运动范围(两种优化:1、仅下和右两种方向,2、数位和的计算基于前一个位置的数位和)
剑指 Offer 13. 机器人的运动范围bug别忘了对走过的位置进行标记,防止重走死循环优化仅走下和右两个方向 基于上个位置的数位和,计算当前位置的数位和难度中等276地上有一个m行n列的方格,从坐标[0,0]到坐标[m-1,n-1]。一个机器人从坐标[0, 0]的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=...原创 2021-04-23 22:04:11 · 73 阅读 · 0 评论 -
leetcode——两数之和 I、II(167)(有序双指针+无序HashMap)
两数之和总结:1、数组本身有序,用双指针(两边向中间夹)2、数组无序(要求返回下标),则不适合先排序再双指针夹逼,而是用HashMap保存目标值。public int[] twoSum(int[] numbers, int target) { //两数之和总结:1、数组本身有序,用双指针(两边向中间夹)2、数组无序(要求返回下标),则不适合先排序再双指针夹逼,而是用 HashMap 保存目标值。 int[] result=new int[2]; ...原创 2021-04-22 21:45:12 · 122 阅读 · 0 评论 -
leetcode——脑筋急转弯(萝卜坑)——剑指03、41、448、442
剑指 Offer 03. 数组中重复的数字难度简单384找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 思路应该首先沟通题目要求:1、不要求空间,要求速度则用hash法(遍历数组,将元素存入hashSet中,遇到Set已经...原创 2021-04-21 10:58:05 · 295 阅读 · 0 评论 -
leetcode——脑筋急转弯类(规律类)——470. 用 Rand7() 实现 Rand10()
已有方法rand7可生成 1 到 7 范围内的均匀随机整数,试写一个方法rand10生成 1 到 10 范围内的均匀随机整数。不要使用系统的Math.random()方法。/** * The rand7() API is already defined in the parent class SolBase. * public int rand7(); * @return a random integer in the range 1 to 7 */class Solu...原创 2021-04-10 00:24:54 · 155 阅读 · 0 评论 -
leetcode-找规律类题目(脑筋急转弯)-48旋转(图形)二维数组
48. 旋转图像难度中等852给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转 90 度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。思路首先发现:(1)规律1“第 i 行变为第 n-1-i列,其原来在哪一列,转后就在哪一行”,即发现m[i][j]->m[j][n-1-i];(2)且四个元素为一组,即四个元素会互相转,即元素1 m[i][j]会转到元素2 m[j][n-1-i],2会转到3 [...原创 2021-04-09 19:15:40 · 300 阅读 · 0 评论 -
leetcode——单调递增栈——862. 和至少为 K 的最短子数组
思路:求的是和至少为 K 的连续最短子数组,首先利用数组prefixSum保存【0~i】的前缀和为多少,容易知prefixSum[j]-prefisxSum[i],表示 i+1~j 的和,因此将问题转化为求以 不同元素结尾时的和至少为 K 的连续最短子数组,要求这个 result[j]其实就是比较所有prefixSum[j]-prefixSum[i](i<j)的情况,如果前缀和相减大于等于 K,则符合情况,将该区间长度与最短长度进行比较,可以直到对于prefixSum[j]-prefixSum[.原创 2021-04-17 11:48:59 · 161 阅读 · 0 评论 -
leetcode——链表操作——138.复制带随机指针的链表
思路方法1:建立原——新映射关系,遍历到某节点时,不仅创建该节点,还创建其后的random节点方法2:将新节点放在原节点后面,然后再分离 思路:不是一次遍历,对每个进行处理的时候再创建新节点,而是两次遍历,第一次创建所有新节点,第二次再修改指向;不然必须修改源节点 关键!!!将链表分离的方法(将间隔节点连在一起,分成两个链),既得到克隆链,又还原原链子(不还原原链子会报错) 题目给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可...原创 2021-04-16 18:19:12 · 150 阅读 · 0 评论 -
leetcode——二叉树——94中序遍历
1、递归 List<Integer> result=new LinkedList<Integer>(); public List<Integer> inorderTraversal(TreeNode root) { helper(root); return result; } public void helper(TreeNode root){ if(root==null) return原创 2021-04-11 17:06:13 · 106 阅读 · 0 评论 -
leetcode——从后数组归并——88. 合并两个有序数组
思路简单思路为两个数组归并到新数组,再将旧数组元素依次替换成新的即可为不占用额外空间,两数组均从后往前找大元素放在原数组的后面。88. 合并两个有序数组难度简单910给你两个有序整数数组nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。初始化nums1和nums2的元素数量分别为m和n。你可以假设nums1的空间大小等于m + n,这样它就有足够的空间保存来自nums2的元素。clas...原创 2021-04-10 20:16:36 · 113 阅读 · 0 评论 -
leetcode——动态规划——322. 零钱兑换
思路:dp[i]表示 金额 i 的硬币组合的硬币最小数量,dp[i]=min(dp[i-coin[j]+1),coin[j]表示不同硬币面额322. 零钱兑换难度中等1191给定不同面额的硬币coins和一个总金额amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。class Solution { public int coinChange(int[] coins,...原创 2021-04-10 15:57:09 · 169 阅读 · 0 评论 -
leetcode-实现数据结构-用栈实现队列
232. 用栈实现队列思路:利用两个栈,一个栈 inStack保存新加入的数据,当需要 pop 或者 peek 栈内最先入栈的元素时,将inStack 中的元素倒入(从顶弹出)outStack 中,即保证再 outStack 中先入 inStack 的元素在outStack栈顶,然后将outStack栈顶弹出或者返回值。难度简单381请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:void pu..原创 2021-04-09 11:28:41 · 223 阅读 · 0 评论 -
leetcode-归并排序-148排序链表
148. 排序链表对链表进行归并排序:归并排序分为自顶向下(将整个拆成两半,利用递归分别对两半进行排序,然后再对排好的两半进行合并,层层递归直到元素大小为1——不可拆分再返回其本身),合并时,对两半从头到尾的方式进行合并(双指针法,指针交替前行,比较两指针指向元素的大小)还可以自底向上,我一般用自顶向下(二分+递归)归并排序的时间复杂度为 O(nlogn)难度中等1082给你链表的头结点head,请将其按升序排列并返回排序后的链表。进阶:你可以在O(nlo...原创 2021-04-09 11:24:22 · 94 阅读 · 0 评论 -
单调栈——求区间最小数乘区间和的最大值(单调增)
思路:计算目标:计算以不同数作为区间最小数时,对应最大区间的(区间和*最小数)的值(因为最小数是固定的,最后要求的结果一定属于最小数*最大区间之和,因此找最大区间即可)。数组元素依次入栈,当当前元素小于栈顶时,可以对栈顶元素作为最小数的情况进行计算(因为此时栈顶元素>其栈内前面的元素,且栈顶元素>当前元素,即栈顶元素作为最小数的区间范围可以确定:栈顶元素对应的下标~当前元素之前),对栈顶元素计算完之后,将其弹出,然后继续对栈顶元素进行判断。直到栈空。类似的题目有:接雨水:(单调.原创 2021-04-08 11:10:49 · 918 阅读 · 0 评论 -
计算数组的小和——程序员代码面试指南
题目描述数组小和的定义如下:例如,数组s = [1, 3, 5, 2, 4, 6],在s[0]的左边小于或等于s[0]的数的和为0;在s[1]的左边小于或等于s[1]的数的和为1;在s[2]的左边小于或等于s[2]的数的和为1+3=4;在s[3]的左边小于或等于s[3]的数的和为1;在s[4]的左边小于或等于s[4]的数的和为1+3+2=6;在s[5]的左边小于或等于s[5]的数的和为1+3+5+2+4=15。所以s的小和为0+1+4+1+6+15=27给定一个数组s,实现函数返回s的小和原创 2021-04-07 22:33:15 · 323 阅读 · 0 评论 -
36进制加法、10进制加法(leetcode-416)
思路:不论是几进制加法,方法都是从两个字符串的末尾开始遍历,将个位数加进 stringbuilder,若有进位则记录(供下次两字符相加时加上这个进位),最后再将 stringbuilder 反转。技巧:不需要判断字符串的谁长谁短,只需要用 i、j(当前遍历字符的下标),当 i或 j 下标越界,即不满足>=0的时候(不再对该字符串进行操作即可:不加上字符串中的字符、不对 i、j 进行增减操作);415. 字符串相加难度简单350给定两个字符串形式的非负整数num1和num2,计...原创 2021-04-07 20:23:11 · 507 阅读 · 0 评论 -
二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针(next)。public class Solution { public TreeLinkNode GetNext(TreeLinkNode pNode) { if(pNode.right!=null){ TreeLinkNode p=pNode.right; while(p.left!=null.原创 2021-04-07 19:40:24 · 70 阅读 · 0 评论 -
整数与IP地址间的转换
整数与IP地址间的转换思路:(1)ip 地址转整数:将 ip 地址按"."分割,对分割的四个字符串均利用Long.parseLong转位数字,对数字分别左移到相应的位置,然后用|拼接即可得到最终的整数,也可以每拼接一个字符串移动8位(2)整数转 ip:将整数与255进行&运算得到最后8位对应的数字,进行3次右移,每次移动8位,得到相应位置对应的数字,然后拼接字符串StringBuilder对象可直接拼接数字。知识点1、String.split用法与转义字符'.'“.”和“|原创 2021-04-07 17:36:43 · 1076 阅读 · 0 评论 -
leetcode-二分查找-69 x 的平方根
69. x 的平方根利用二分查找的思想,一般 x 的平方根都小于 x 的一般,因此二分查找范围:[0,x/2],对于 x==1的情况,则是[0,x],或者直接将 right 统一为 x/2+1;然后判断中间点middle,如果(long)middle*middle(这里需要设置为 long 类型)等于 x,则直接返回 middle,若小于 x,则将左范围 left=middle( middle 可能为最终结果,因此middle 不能排除在搜索范围之外,这里需要注意防止 middle 永远为 lef原创 2021-04-07 12:20:18 · 111 阅读 · 0 评论 -
leetcode 技巧点、常用方法、容易忘知识点总结
1.while(size--)在层序遍历中的应用层序遍历时不要用两个队列来回替换,用size,节省空间199. 二叉树的右视图https://leetcode-cn.com/problems/binary-tree-right-side-view/原创 2021-03-30 11:49:21 · 333 阅读 · 0 评论 -
leetcode-二分查找-34
思路:分别找到最左和最右边 target 的下标。(1)找到最左边 target的关键在于:当找到的中位数等于 target 时(nums[m]>target),将范围向左缩小,即将右边界r向左移动, 即 r=m,而将 r 向左移动的情况还包括(nums[m]>target),因此二分的条件应为当(nums[m]>=target)时,r=m。(2)又因为循环中有右标 r指向 target ,l =r+1的情况发生,因此为了使得循环能够结束,避免 m 位置始终不发生改变,此时应用 l 和 r原创 2021-03-21 20:06:56 · 81 阅读 · 0 评论