摘要: 假设首元素即为结果,那么其必然再后续所有字符串中完整出现。 进行迭代,两两比较,遇到不同元素则表示截至当前元素得最长公共前缀已得出 时间O(m*n)(m为每个元素平均长度,n为元素个数),空间O(1) public String longestCommonPrefix(String[] strs) 阅读全文
posted @ 2021-03-26 14:57 jchen104 阅读(64) 评论(0) 推荐(0)
摘要: 傻傻的想了半天,看了题解才想起来高斯求和,真的巧妙。 高斯求和,高中数列得知识,等差数列之和=(首项+尾项)*项数/2 根据题意可得只少一个元素,那么先算出和然后再迭代一次减去所有元素即可 时间O(n),空间O(1) public int missingNumber(int[] nums) { in 阅读全文
posted @ 2021-03-26 14:50 jchen104 阅读(39) 评论(0) 推荐(0)
摘要: 投票法可解,思路如下: 假设第一个元素为多数,那么每次遇到相同元素+1,不同元素-1,迭代一遍之后必然有count>0(题目中多数得定义为出现次数大于1/2) 但是这个时候有一个问题,就是假设第一个元素不是多数,或者虽然是多数,但是在左侧某一段内非多数比如[2,1,1,2,2]在前三个 元素时2就是 阅读全文
posted @ 2021-03-26 14:42 jchen104 阅读(59) 评论(0) 推荐(0)
摘要: 题目要求在原数组上进行操作,于是又想到了双指针迭代的办法,维护一个快指针一个慢指针(参考283. 移动零), 每次快指针遇到与慢指针不同的元素则进行覆盖慢指针指向的下一元素(这里跟移动零有一点区别,因为这里是找 不通的元素,当前元素是不覆盖的)。时间O(n),空间O(1) public int re 阅读全文
posted @ 2021-03-26 14:04 jchen104 阅读(68) 评论(0) 推荐(0)
摘要: 双指针,类似弗洛伊德算法的办法,依次向后递推,每次快指针遇到不为0的 数就覆盖慢指针指向的下标,当快指针指向末尾,非0数就没有了,这个时候再 将慢指针截至末尾的数全部用0覆盖即可。这里在做了一点优化,利用for循环自身 的属性替代了快指针,我们只用维护一个慢指针就行了。 时间O(n),空间O(1) 阅读全文
posted @ 2021-03-26 13:07 jchen104 阅读(51) 评论(0) 推荐(0)
摘要: 很简单的迭代,时间O(n),空间O(1) public int maxProfit(int[] prices) { // 记录一个最小值,每次遇到更小的值就迭代掉, // 同时每次循环都判断一下是否可以获得最大收益 int minPrice=Integer.MAX_VALUE,res=0; for( 阅读全文
posted @ 2021-03-26 10:43 jchen104 阅读(39) 评论(0) 推荐(0)
摘要: 很经典的DP题,用dp[i]纪录[0,i]的数组的最大子序和,往后递推实际上就是判断 nums[i+1]是否能给dp[i+1]带来增益效果,使得dp[i+1]>dp[i] public int maxSubArray(int[] nums) { // dp[i]纪录以截至i结尾的最大子序和 int[ 阅读全文
posted @ 2021-03-26 10:40 jchen104 阅读(47) 评论(0) 推荐(0)
摘要: 第一眼想到的思路是迭代,必然存在 res*res<x<(res+1)*(res+1),这样的话在n^0.5的时间内可以处理好, 于是有以下代码 public int mySqrt(int x) { int res = 0; // 必然存在 res*res<x<(res+1)*(res+1) whil 阅读全文
posted @ 2021-03-26 10:12 jchen104 阅读(94) 评论(0) 推荐(0)