
leetcode中值得思考的题
收录一些在刷leetcode中遇到的有价值的,值得思考和反思的题目。
余丰旭
这个作者很懒,什么都没留下…
展开
-
划分为k个相等的子集
leetcode698 划分为k个相等的子集 解题之前先将题目等效为更容易求解的问题,这一题可以转换为一组数放入若干个桶中,使每个桶中数字的和均为target。 这一题有两种解题视角: 1.从数字角度出发,每个数字选择一个桶放入 2.从桶角度出发,每个桶选择若干数字放入自身 解法1: 该解法中,事先对数组进行由大到小的排序,可以大幅提升效率,原因在于:如果本轮的一系列选择最终会导致溢出,那么应该让溢出早点发生,不浪费算力,因此大的放前边可以使迟早会溢出的一组数早点溢出,提高效率。 class Solutio原创 2021-08-19 14:50:04 · 196 阅读 · 0 评论 -
K 站中转内最便宜的航班
这一题是带有限制的带权最短路径题目。 方法一:改进的BFS,使用优先级队列(超时) 一般遇到最短路径(最少步骤、最近距离)的题目,要下意识地想到用BFS。 这一题是带权的,直接bfs不好写,可以借助于优先级队列,这一题中需要用到小根堆,每次选择距离src最近的进行处理 class Node{ public: int N; //号 int K; //与src之间有多少个中转节点 int D; //与src之间的距离 Node(int n,int k,int d):N(n)原创 2021-08-13 15:50:09 · 181 阅读 · 0 评论 -
leetcode316去除重复字母
leetcode316去除重复字母 这一题中堆字符串有三个要求 1.去重 2.相对位置不变 3.字典序最小 要保持相对位置不变,可以理解为在原字符串中对每个字符选择保留或者删除,这样处理完的字符串中的各个字符就肯定保持了原本的相对位置不变。 至于这一题为什么要选择单调栈来处理,我想是在思考这道题目的时候,进行遍历,发现了先进后出的规律,才能想到用栈,进而在字典序要最小的要求下,才产生了单调栈的想法。绝不是上来一眼就看出来使用单调栈。 class Solution { public: string r原创 2021-08-04 19:47:43 · 148 阅读 · 0 评论 -
leetcode710黑名单中的随机数
710黑名单中的随机数 涉及到等概率的问题,一般都得使用数组(用随机数作下标等概率随机返回一个数)来解决,数组即为一种顺序存储的结构,因此逻辑上顺序,也能够满足要求。 下面的图片用√表示有效数字,X表示在黑名单中的数字。其中,虚线是,最终将所有有效数字挪到左侧以后,和右侧黑名单数字的分界线(用总数量减去黑名单数量,即可得到最终有效数字的数量) 如图,根据虚线划分位置的数学原因,左侧X的数量和右侧√数量相同,因此只要将左侧的X映射到右侧每个√,即可完成任务。后序在虚线左侧随机返回一个下标值,就达到了题目的要求原创 2021-08-04 12:42:37 · 159 阅读 · 0 评论