166. Fraction to Recurring Decimal
- 分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
1 | class Solution { |
371. Sum of Two Integers
371.两整数之和
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
1 | class Solution { |
- 分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
1 | class Solution { |
371.两整数之和
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
1 | class Solution { |
- Excel表列序号
1 | class Solution { |
50.Pow(x,n)
很经典的一道题。
1 | class Solution { |
- 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
1 | class Solution { |
昨天太累了,就没更新。。今天一起更下。
昨天主要做的基本都是比较简单的dp题目。
55.跳跃游戏
因为是dp专题,所以肯定有dp解法:其实感觉也不算严谨的dp吧。。canGo[n]表示n可否到达
1 | class Solution { |
还有种复杂度是O(n)的解法,求出从0出发可以到达的最远点。
1 | class Solution { |
62.不同路径
dp解法非常简单。。
1 | class Solution { |
另外一种解法就是求C(m-1,m+n-2)。
- 零钱兑换
1 | class Solution { |
1 | class Solution { |
- 二叉树的序列化与反序列化
一道不是非常hard的hard题,深切感受到了StringBuffer的快速。
1 | /** |
- 阶乘后的零
数学题。找规律。还以优化下,从两次循环减少到1次循环。
1 | class Solution { |
- 数组中的第K个最大元素
感觉是非常经典的一道题目,一开始自己尝试了下手写快排。。一堆bug,又百度学了半天快排算法。。然后试了下评论区大佬的最小堆,这快的也太多了把!完全不是一个数量级的。
感觉手写一个堆结构也是很基本的能力,任重而道远。
1 | class Solution { |
解法2️:最小堆1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53class Solution {
//堆排序的过程就是首先构建大根堆,然后对顶元素(及最大元素)与最后个元素替换位置,heapsize减一,重新调整堆变成大根堆。
//重复上面操作直到heapsize等于一的时候。排序完成。
public int findKthLargest(int[] nums, int k) {
// 建一个大小为k+1(第一个结点不使用)的数组
int[] heap = new int[k+1];
for(int i = 0; i < k; i++){
heap[i+1] = nums[i];
}
// 堆化。建立一个大小为k的小顶堆
// 从最后一个非叶子结点k/2自上往下开始进行堆化,该结点堆化完后就轮到前一个非叶子结点再自上往下进行堆化
for(int i = k/2; i > 0; i--){
heapify(heap,k+1,i);
}
// 继续遍历数组中剩余的数字,并与堆顶元素进行比较,
// 若大于堆顶元素,则替换掉堆顶元素,并自顶向下堆化
for(int i = k; i < nums.length; i++){
if(nums[i] > heap[1]){
heap[1] = nums[i];
heapify(heap,k+1,1);
}
}
return heap[1];
}
// 自顶向下堆化。一般在删除堆顶结点后,把最后一个结点放到堆顶的时候使用。
// 即这时堆中已经是部分堆化
private void heapify(int[] heap,int len,int index){
while(true){
// 找出当前结点和两个直接子结点的最小值
int minPos = index;
if(2*index < len && heap[2*index] < heap[minPos]){
minPos = 2*index;
}
if(2*index+1 < len && heap[2*index+1] < heap[minPos]){
minPos = 2*index + 1;
}
// 若当前结点是最小的,说明下面的是堆化好的了,直接退出循环
if(minPos == index){
break;
}
// 当前结点与最小值进行交换
swap(heap,index,minPos);
// 当前结点更改为最小直接子结点,继续往下堆化
index = minPos;
}
}
private void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
56.合并区间
看评论区,基本上都是先按照区间头排序,然后再处理。自己写了个不用sort的算法,用map去替代。有点开心。
1 | class Solution { |
- 搜索二维矩阵 II
也就错了这么十几次。。。自闭了。 在分治到2*2范围时我就有点不知道该如何处理了。越写头越晕,无限改BUG。
不过最后效率还是相当不错的。
1 | class Solution { |
感觉时间真的挺紧的,今天上午有点事情就没学习,下午和晚上加起来也就只能刷个三题,书也看不了多少啦。
46.全排列
1 | class Solution { |
- 子集
和上一题类似
1 | class Solution { |
- 单词搜索
DFS+回溯。。
1 | class Solution { |
75.颜色分类
三路快排
1 | class Solution { |
步入五月,感觉生活正在逐渐变得紧凑,这学期的课程都还没咋学,还有三门实验课要应付,再加上最近开始看java了,所以以后刷题量可能会减少点,但肯定不会停下!
还有个问题就是,初级算法卡片刷完了,现在开始刷中级算法了,感觉好难啊!。。头秃。
15.三数之和
C++.感觉好难啊!一开始不知道为什么总想着用map做,试了半天总是无法解决漏解的问题。。
看了答案才会做。
第一个是三指针的处理方式,将复杂度从O(n^3)降到了O(n^2)。学习了。
第二个是重复解的剔除,不需要通过set就可以实现。
1 | class Solution { |
73.矩阵置零
之前看过这道题,大概知道不用额外空间思路,但是自己写起来又犯蠢了。。
用来做标志位的首行和首列不能先乱动(不然就全部变成0了),,
解决方案是用两个bool去存是否要把首行首列变0
1 | class Solution { |
- 最长回文子串
这道题简直是剧毒。。做得我头都大了。昨天晚上做了俩小时,今天下午又看了俩小时 做了三种方法,dp,中心拓展,马拉车算法
解法1: 动态规划
二维动态规划,不看答案根本想不到。bobo
1 | class Solution { |
解法2: 中心拓展算法
比较容易理解,但是没想到当时。
1 | public String longestPalindrome(String s) { |
解法3: 马拉车算法
网上博客都看不太懂,说得都不是人话。。找了篇漫画感觉讲的还挺形象的,附上链接:
点击查看漫画
然后照着源码写了下java版本的,第一次用StringBuffer. sb哈哈哈。
感慨On复杂度确实比On^2快了好多……
1 | class Solution { |
- 递增的三元子序列
挺有意思的一道题,想清楚就好了,只要记录当前最小值和某个子序列里第二大的数就可以了。
1 | class Solution { |
- 二叉树的锯齿形层次遍历
层次遍历的变种,没啥难度。
1 | class Solution { |
- 二叉搜索树中第K小的元素
中序遍历即可。
1 | class Solution { |
- 电话号码的字母组合
发现之前好久没接触过回溯的题目了。。第一个想法就是for循环,但是不知道String的长度
偷看了评论区答案,用递归去写。。。没有必要记录步长、。
1 | class Solution { |
22.括号生成
1 | class Solution { |
终于贴完了,收工!

1 | class Solution { |
1 | public class Solution { |
1 | class Solution { |
说一下,今天开始代码尽量准备用java写了,感觉好不习惯。。
1 | // dp[i]表示前n户并且抢劫过第n家的max,感觉自己想复杂了。。。也可以通过。 |
1 | class Solution { |
java:
1 | class Solution { |
计数质数
一开始的想法就是判断从1-n的每个数是否为质数,时间复杂度O(n^2)
最简单的方法当然通过不了,参考了某大佬的一篇博客进行剪枝
附连接:判断一个数是不是质数(素数),3种方式介绍
1 | class Solution { |
然后根据题目下面的提示,了解了埃拉托色尼筛选法(质数问题)。唯一疑惑就是明明应该可以从i*i开始覆盖,不知道为什么总会报错说数组越界。
1 | class Solution { |
递归解法很常规
1 | class Solution { |
评论区大佬的两种解法:
1 | class Solution { |
1 | class Solution { |
写得太丑陋了。。不忍直视。。。有空一定重新用switch写下。。
1 | class Solution { |
为什么java里面没有unsignedint啊??????
学了了评论区大佬的解法,体会了下n=n&(n-1)的妙用(每次可以消掉一个1).
1 | public class Solution { |
1 | class Solution { |
- 删除链表中的节点
感觉还是思路被桎梏了哈哈,说到删除节点第一时间想的永远是让被删除的前一个结点next指向被删除的next,为什么不换个思路去重新生成从被删除开始之后的整个链表呢
1 | class Solution { |
- 合并两个有序数组
1 | class Solution { |
爬楼梯
斐波那契数列。。
1 | class Solution { |
- 最大子序和
这题实在是太难了。。。想了一上午都没想明白,说到底还是自己太菜了。。。到现在也只是勉强能理解标准答案。
评论区大佬解答:这道题难度不该是easy 这道题的一开始我想到的是暴力的滑窗去做,复杂度O(n^2),显然达不到题目中要求的复杂度 这道题根据题目关键词,“最大”“连续”,可以判断是一道动态规划,附上这道题目的wiki链接https://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E5%AD%90%E6%95%B0%E5%88%97%E9%97%AE%E9%A2%98 方法如下:
1.定义一个函数f(n),以第n个数为结束点的子数列的最大和,存在一个递推关系f(n) = max(f(n-1) + A[n], A[n]);
2.将这些最大和保存下来后,取最大的那个就是,最大子数组和。因为最大连续子数组 等价于 最大的以n个数为结束点的子数列和
1 | class Solution { |
从排序数组中删除重复项
双指针法解决。当数值不同且不指向同一个时替换。写的有点丑陋,可以利用nums[i]的值去替代temp
1 | class Solution { |
买卖股票的最佳时机
动态规划 前i天的最大收益 = max{前i-1天的最大收益,第i天的价格-前i-1天中的最小价格}
1 | class Solution { |
- 买卖股票的最佳时机 II
贪心没啥思路,偷看了评论区的答案:[7, 1, 5, 6] 第二天买入,第四天卖出,收益最大(6-1),所以一般人可能会想,怎么判断不是第三天就卖出了呢? 这里就把问题复杂化了,根据题目的意思,当天卖出以后,当天还可以买入,所以其实可以第三天卖出,第三天买入,第四天又卖出((5-1)+ (6-5) === 6 - 1)。所以算法可以直接简化为只要今天比昨天大,就卖出。
1 | class Solution { |
旋转图像
虽然是道medium题,但是感觉其实也没很难。。想了很久才明白旋转规则。(四个结点旋转)
1 | class Solution { |
- 有效的字母异位词
建立字母表 再比较。 也可以用map去做。
1 | class Solution { |
- 验证回文串
双指针法,感觉贴题目好有成就感。。题目不难,比较繁琐的是大小写的转换以及干扰字符去除的写法。
1 | class Solution { |
1 | class Solution { |
实现strStr()
1 | // 我枯了,明明是道ez题,居然随便写写过不了。。。还要剪枝。。 |
Update your browser to view this website correctly. Update my browser now