1.当只用到数据最值,而其他位置数据无效时,可以考虑将数据分成多段,每段用大(小)根堆储存数据
具体可参考题目:连续中值
2.关于最短序列问题,首先想到图的广度优先搜索,起初用深度优先搜索,超时。可见此类问题广度优先搜索比深度优先更快
具体参考题目:单词接龙
3.记忆化深度优先遍历
public int dfs(int[][] matrix,int[][] memo,int row,int line)
{
//结果存储在memo[][]中
if(memo[row][line] != 0)
return memo[row][line];
//若不为0 证明已存储过结果,直接从缓存中读取,防止重复计算
memo[row][line]++;
//上
if(row > 0 && matrix[row][line] > matrix[row-1][line])
memo[row][line] = Math.max(memo[row][line],dfs(matrix,memo,row-1,line)+1);
//下
if(row+1 < matrix.length && matrix[row][line] > matrix[row+1][line])
memo[row][line] = Math.max(memo[row][line],dfs(matrix,memo,row+1,line)+1);
//右
if(line+1 < matrix[0].length && matrix[row][line] > matrix[row][line+1])
memo[row][line] = Math.max(memo[row][line],dfs(matrix,memo,row,line+1)+1);
return memo[row][line];
}
具体可参考题目最长递增路径
4.当需要比较两个分数a/b 和 c/d 大小时,可以直接对它们进行比较,但有可能产生浮点数的计算降低程序效率,并且可能引入浮点数误差。一种可行的替代方法是比较a * d 和b * c,以乘法替代除法
具体可参考题目第k个最小的素数分数
5.获取数num中某位数:
(num / (int) (Math.pow(10, 0(个位)))) % 10
或者用字符串截取的方式
具体可参考题目第N位数字
6.当需要提高时间效率时,考虑空间换时间,例如构建成对哈希表,形成双向索引
具体可参考题目LFU缓存
7.适用双向链表的好处:当定位到其中某一节点时,能够在O(1)时间里删除该节点,而单项链表需要先定位再遍历定位再删除,需要O(n)时间
具体可参考题目LRU缓存
实现LRU/LFU缓存:使用哈希表配合双向链表,实现O(1)时间内插入删除
8.String对象的内建函数hashCode()计算方法:
charAt(0)∗31 (n−1)+charAt(0)∗31 (n−2)+…+charAt(n-1) 其中n为字符串长度
具体可参考题目TinyURL 的加密与解密
9,各位相加:给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
思路:对于给定数abc = 100a + 10b + c = 99 * a + 9 * b+ (a + b + c)
(99a + 9b)%9 = 0 因此abc与最终结果的各位数之和对9取余结果相等
if(num % 9 != 0)
return num % 9;
else
{
if(num == 0)
return 0;
else
return 9;
}
10.适当利用位运算方法
如何判断一个正整数是否满足以下条件:二进制位总是0、1交替出现
假设该数满足条件(num = 10101) 则(num >> 1 == 1010)
通过异或运算后 temp = num ^(num >> 1) = 11111
temp + 1 = 100000 如此发现temp & (temp + 1) = 0
具体可参考题目交替位二进制数
11.生成随机数
Math.random() :返回[0,1)区间的double类型数
new Random().nextInt(num) :返回[0,num)区间的int类型数
水塘抽样法实现生成满足要求的随机数
for (int i = 0, cnt = 0; i < nums.length; ++i)
{
if (nums[i] == target)
{
++cnt; // 第 cnt 次遇到 target
if (random.nextInt(cnt) == 0)
{
ans = i;
}
}
}
具体可参考题目随机数索引
12.单调栈
面向问题:在一维数组中对每个数找出第一个满足某种条件的数,且需要查找时间复杂度为O(n)时,首先考虑利用单调栈解决问题
具体可参考题目:柱状图中最大的矩形 接雨水