01 2023 档案
摘要:题目: 思路: 【1】55. 跳跃游戏的思路 【1.1】重点在于记录最大可达位置,对于单次全部遍历数组,如果在可达范围则要判断在这个位置的可达处是否比之前的远,远就要保留下最大可达范围,如果最大可达范围超过了最后的位置即可达。当然也会出现当前位置不在可达范围内,如果出现了那么必然不能到达最后,因为你
阅读全文
摘要:题目: 思路: 【1】使用哈希辅助空间的简单处理,记录出现的次数,然后把次数为1的提取出来。 【2】转化为位数统计,因为转化成位数只有只有1和0,如果有1即代表出现一次,所以除以对应的次数得到的余数便是剩下的那个数字留下的。【这种和哈希辅助空间都是算是可以通用的,即使条件变化了,对应修改的依旧是次数
阅读全文
摘要:题目: 思路: 【1】回溯 + 哈希表(更简洁的说法应该是递归+哈希表),本质上是采用辅助空间来作为记录节点,用原本链表上的节点在哈希表中作为key指向value值的复制出来的链表的节点,这种相对简单易懂。 【2】迭代 + 节点拆分(这种的话可以参考如何将回溯变为双循环,然后其实又是利用一个循环在原
阅读全文
摘要:题目: 思路: 【1】本身对链表的处理其实离不开遍历链表,准确点的话其实这道题双指针的效率应该是最佳的,毕竟就只用了额外的两个变量。而且也只遍历了一遍。 【2】当然采用递归也是可以的,本身只考虑反转而没有其他要求的话,递归用的变量是最少的,但是内存空间就不一定了,毕竟调用栈也是需要内存空间的,所以其
阅读全文
摘要:题目: 思路: 【1】本质上,递归,辅助栈都是可以实现的方法,但是相比于递归,如果能用循环解决的话我更喜欢循环,因为递归也是需要消耗内存空间的,而且本质上其实只需要知道链表大小其实就很好做了,数据从后面往前面填充即可。 代码展示: //时间4 ms击败4.55% //内存42 MB击败52.97%
阅读全文
摘要:题目: 思路: 【1】贪心的思路 【2】进阶的分治法 它不仅可以解决区间 [0,n−1],还可以用于解决任意的子区间 [l,r] 的问题。如果我们把 [0,n−1] 分治下去出现的所有子区间的信息都用堆式存储的方式记忆化下来,即建成一棵真正的树之后,我们就可以在 O(logn)的时间内求到任意区间
阅读全文
摘要:题目: 思路: 【1】利用额外空间做记录,保留对应的最小值,这样每次想要获得当前栈的最小值的时候都可以拿到,当然对应元素出栈的时候,对应的最小值也会被抛弃。 时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)。因为栈的插入、删除与读取操作都是 O(1),我们定义的每个操作最多调用栈操作两次。
阅读全文
摘要:题目: 思路: 【1】利用栈的特性来实现队列的特性,首先栈是后进先出的,所以插入的时候先放到A栈,而取出的时候是从B栈取出。那么B栈是如何填充的,当B栈为空的时候,又遇到取出,必先判断A栈是否为空,如果不为空,将A栈的数据导入到B栈。这样B栈的最上面数据其实就已经是满足先进先出的队列特性了。而且当B
阅读全文
摘要:题目: 思路: 【1】模拟二进制进行加减位移,要先拿出两个字符串的长度,然后从末尾开始相加到首部,由于记录的时候数组是先记录尾部的所以还要进行翻转,在转成字符串。 【2】另一种思路是,先转为十进制的整数,相加后再转回二进制,但是这个要考虑到溢出的问题,因为字符串的长度限制远大于Long类型转成二进制
阅读全文
摘要:题目: 思路: 【1】首先是要明确溢出的情况,由于负数的数值是比正数多一位的,所以会存在Integer.MIN_VALUE/-1,这样就会大于Integer.MAX_VALUE 【2】基于暴力破解的思想,可以采用减法替代除法,这样是可以完成题目的要求的,但是还可以采用倍增的方式来加大减数的大小,如-
阅读全文
摘要:题目: 思路: 【1】基于暴力的方式 【2】动态规划 +位运算 对于所有的数字,都可以分为奇数和偶数两种: 奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。 偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。 因为最低位是 0,除以 2 就是右
阅读全文
摘要:题目: 思路: 【1】先说说暴力破解,基于双循环取出所有的可以分割的字符串,然后判断是否是回文数,是的话记录长度是否比已知的还要长,是的话,则记录长度。暴力破解本身思想很简单,但是做的无用功也多,因为每个字符串都要处理一遍,然而很多字符串其实都是不需要的,那么减少要处理的字符串就是优化的重点。 【2
阅读全文
摘要:题目: 思路: 【1】首先简单点,考虑使用辅助空间,然后对于数组肯定是要遍历的,时间复杂度是O(N^2),遍历第一次肯定要标记一下哪一行与哪一列是要变为0的。然后开始第二次循环,根据标记置为0。思路看着颇为清新。 【2】对于进阶要求使用常量空间,其实本质上可以采用数组的第一行与第一列进行替代: 第一
阅读全文
摘要:题目: 思路: 【1】基于正常思维便是暴力破解,但是这种时间复杂度为O(N^3),基本很容易超时。而且还要去重【这里由于是无序的,所以又要用到排序】。 【2】那么既然是要排序的何不一开始就将无序的数组变为有序呢,一旦变为了有序,那么问题处理起来就会变得简单起来: 如数组[-4,-1, -1, 0,
阅读全文
摘要:题目: 思路: 【1】由于是int类型的相除得到的小数,其实是会出现溢出的情况,如-2147483648/-1。所以为了避免其实可以采用long类型扩大范围。 【2】整数部分直接/就可以得到了,问题是小数部分会存在循环,从数学角度,循环的产生本质上是因为余数除以除数除不尽,而且会出现重复的现象,那么
阅读全文
摘要:题目: 思路: 【1】从数学角度上来说,除法本质上就是可以转化为减法的,如10/3,本质上就是找出10最多能减去多少个3【这是编程思维,在java中/是不保留小数的】,所以简单的可以转化为循环遍历的减法【暴力破解的方式】 【2】当然基于暴力破解的思路,要做的便是简化循环,那么可以在循环中每次都先找到
阅读全文
摘要:题目: 思路: 【1】基本上只能靠推导: 首先肯定要知道整个数组中每个任务的个数【这里需要循环遍历】,便于找出最大任务的个数 最大任务个数是1: 假设任务是"A",假设个数为x【现在假设是3,用于演示】,假设步长n为3,则必然会出现下列情况 "A"->未知->未知->未知->"A"->未知->未知-
阅读全文
摘要:题目: 思路: 【1】这两道题本质上考察的是差不多的意思。 【2】这道题的本质上是考察二进制,因为在编程中数据是采用二进制进行存储的,所以便是要考察二进制的处理,即异或(^),相与(&) 理解异或 和 相与 异或: 当 1与1进行异或的时候得0,0与1异或的时候得1 相与: 当 1与1进行相与的时候
阅读全文
摘要:题目: 思路: 【1】首先必然是按照规律顺序写出来,那么就是暴力破解思维,采用单循环来处理,但是基于n可以达到int的最大范围值,这个时候会容易变成遍历很多的情况,又由于在数学是2的16次方 其实与 4的八次方,8的4次方,16的2次方是相等的,那么基于这种思路可以将16次循环减少为3次【折半思维】
阅读全文
摘要:题目: 思路: 【1】正常点的思维大概率会是先阶乘把数算出来,然后转成字符串遍历0的个数,但是这样很容易超出类型的限制范围,所以只能推导数学公式,首先0的产生必然是10乘以某个数,而10的产生必然是2*5【要记住是尾随的0,所以必然是10导致的】。 而且在阶乘里面,如5!或10! 分解: 5!=5*
阅读全文
摘要:题目: 思路: 【1】话不多说这道题本身暴力破解是可以过的,而且基于限制为Integer.MAX_VALUE,所以可以知道根号为46341,那么基于这个进行遍历就好了。 【2】基于二分进行优化,因为从暴力破解这里我们看到了,不一定需要遍历那么多数据,所以筛选数据快的方式不就是二分吗,一下子过掉一半的
阅读全文
摘要:题目: 思路: 【1】本质上快乐数就是某个数的,各个位上的数的平方相加的到的是1就是快乐数【而且重复这个动作,最终得到的是1的也是快乐数】,而这个过程存在循环也就是会存在重复的数字进行重样的步骤,所以考虑到破解循环,一般要对数字进行记录,这便是比较常规的做法。 【2】但是又有一种更快的方式,就是用空
阅读全文
摘要:题目: 思路: 【1】其实实现交替排序的先决条件便是我们对拿到的无序数组进行有序化,然后采用双指针,一个指向数组头部,一个指向数组尾部,取出数据,以跨度为2的步长,向新数组填充就可以了。时间复杂度 O(nlogn) 空间复杂度 O(n)。 【2】在进阶中要求我们时间复杂度O(N),而且基于数据不会大
阅读全文
摘要:题目: 思路: 【1】核心点在于怎么理顺对数组进行排序,这差不多就是要针对两个元素进行两两组合,然后按组合的大小进行排序。可以理解为:把两个字符串,两两交换位置之后拼接,再比较基于字符串中每个字符的Unicode值的大小。 代码展示: 基于原生的排序函数进行处理: class Solution {
阅读全文
摘要:题目: 思路: 【1】有点yue,貌似暴力破解也是不错的 代码展示: class Solution { public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { Map<Integer, Integer
阅读全文
摘要:题目: 思路: 【1】这道题感觉是在考察对数据结构的映射关系的熟悉吧,基于要实现每个函数的平均复杂度为O(1),那么map结构便是我们应该考虑的,因为map的插入和删除都可以通过哈希直接定位【虽然理论是这样,但是真实的hashMap对于槽位还是存在遍历】,但是又基于随机方法又能够直接获取,而且还不需
阅读全文
摘要:题目: 思路: 【1】这道题乍看一下会觉得有点懵逼,但转化一下,便可以看成是多进制转10进制的样子: //在二进制中,101这种可以看作为 2**2*1+2**1*0+2**0*1 那么对应转化为 A = 26**0*1 = 1*1 = 1 AB = 26**1*1 + 26**0*2 = 26*1
阅读全文
摘要:题目: 思路: 【1】这题一看率先会想到的就是双指针,通过头尾两个指针指向,进行比对,遇到空格以及特殊字符要跳过,然后判断,如图: 【2】另外本身我们还可以使用默认的函数方法来处理,如,用正则匹配清除非字母数字字符,然后转成小写,再反转,再匹配。 代码展示: 双指针的两种写法: 第一种,在循环里面拿
阅读全文
摘要:题目: 思路: 【1】这种如果简单点的就是可以利用JDK的API来快速完成 【2】其实并没有什么进阶不进阶的,了解过归并算法的,其实便可以参考,新开辟一个足够存储的空间,然后按照指针指向分别从两个数组中拿出数据塞入新开辟的空间,这种其实就满足了遍历完两个数组的长度,也就是符合时间复杂度O(M+N)
阅读全文
摘要:题目: 思路: 【1】这种如果做题做得多的话大概一瞬间便会有思路了,利用字节的位来进行异或,由于只存在一个元素是单独的,而其他的都会存在两次,那么基于异或的相同数字会等于0,也就是相当于清空了,则剩下的唯一的不可被清除的就是那个单独的元素。 【2】而限制则会是两个,常量额外空间即空间复杂度为O(1)
阅读全文
摘要:记录redis中使用过程,不常见的会返回NULL的问题
阅读全文