leetcode心得

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)时,首先考虑利用单调栈解决问题
具体可参考题目:柱状图中最大的矩形 接雨水

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值