Skip to content

Commit e3864a9

Browse files
committed
update
1 parent 3e5a259 commit e3864a9

File tree

11 files changed

+368
-0
lines changed

11 files changed

+368
-0
lines changed

0815.公交路线/README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
给你一个数组 ```routes``` ,表示一系列公交线路,其中每个 ```routes[i]``` 表示一条公交线路,第 ```i``` 辆公交车将会在上面循环行驶。
2+
3+
* 例如,路线 ```routes[0] = [1, 5, 7]``` 表示第 0 辆公交车会一直按序列 ```1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> ...``` 这样的车站路线行驶。
4+
5+
现在从 ```source``` 车站出发(初始时不在公交车上),要前往 ```target``` 车站。 期间仅可乘坐公交车。
6+
7+
求出 **最少乘坐的公交车数量** 。如果不可能到达终点车站,返回 ```-1```
8+
9+
 
10+
11+
**示例 1:**
12+
```
13+
输入:routes = [[1,2,7],[3,6,7]], source = 1, target = 6
14+
输出:2
15+
解释:最优策略是先乘坐第一辆公交车到达车站 7 , 然后换乘第二辆公交车到车站 6 。
16+
```
17+
**示例 2:**
18+
```
19+
输入:routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
20+
输出:-1
21+
```
22+
23+
**提示:**
24+
25+
* ```1 <= routes.length <= 500.```
26+
* ```1 <= routes[i].length <= 105```
27+
* ```routes[i]``` 中的所有值 互不相同
28+
* ```sum(routes[i].length) <= 10^5```
29+
* ```0 <= routes[i][j] < 10^6```
30+
* ```0 <= source, target < 106```
31+
32+
来源:力扣(LeetCode)
33+
链接:https://leetcode-cn.com/problems/bus-routes
34+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

0815.公交路线/solution.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const int MAXN=1e6;
2+
int vis[MAXN];
3+
const int MAXL=500;
4+
int busVis[MAXL];
5+
const int INF=0x3f3f3f3f;
6+
class Solution {
7+
public:
8+
int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
9+
if (source==target) {
10+
return 0;
11+
}
12+
int sz=routes.size();
13+
unordered_map<int,vector<int>> ump;
14+
for (int i=0;i<sz;i++) {
15+
for (int j:routes.at(i)) {
16+
ump[j].push_back(i);
17+
}
18+
}
19+
memset(vis,0x3f,sizeof(vis));
20+
memset(busVis,0,sizeof(busVis));
21+
vis[source]=0;
22+
queue<int> que;
23+
que.push(source);
24+
while (!que.empty()) {
25+
int cur=que.front();
26+
que.pop();
27+
for (int bus:ump.at(cur)) {
28+
if (busVis[bus]==1) {
29+
continue;
30+
}
31+
for (int nxt:routes.at(bus)) {
32+
if (vis[nxt]!=INF) {
33+
continue;
34+
}
35+
vis[nxt]=vis[cur]+1;
36+
que.push(nxt);
37+
if (nxt==target) {
38+
return vis[nxt];
39+
}
40+
}
41+
busVis[bus]=1;
42+
}
43+
}
44+
return -1;
45+
}
46+
};

0909.蛇梯棋/909_1.png

140 KB
Loading

0909.蛇梯棋/README.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
N x N 的棋盘 ```board``` 上,按从 ```1``````N*N``` 的数字给方格编号,编号 **从左下角开始**,每一行交替方向。
2+
3+
例如,一块 6 x 6 大小的棋盘,编号如下:
4+
![img](909_1.png)
5+
6+
```r``````c``` 列的棋盘,按前述方法编号,棋盘格中可能存在 “蛇” 或 “梯子”;如果 ```board[r][c] != -1```,那个蛇或梯子的目的地将会是 ```board[r][c]```
7+
8+
玩家从棋盘上的方格 ```1``` (总是在最后一行、第一列)开始出发。
9+
10+
每一回合,玩家需要从当前方格 ```x``` 开始出发,按下述要求前进:
11+
12+
* 选定目标方格:从编号为 ```x+1,x+2,x+3,x+4,x+5```,或者 ```x+6``` 的方格中选出一个作为目标方格 ```s``` ,目标方格的编号 ```<= N*N```
13+
* 该选择模拟了掷骰子的情景,无论棋盘大小如何,你的目的地范围也只能处于区间 ```[x+1, x+6]``` 之间。
14+
* 传送玩家:如果目标方格 ```S``` 处存在蛇或梯子,那么玩家会传送到蛇或梯子的目的地。否则,玩家传送到目标方格 ```S``` 。 
15+
16+
注意,玩家在每回合的前进过程中最多只能爬过蛇或梯子一次:就算目的地是另一条蛇或梯子的起点,你也不会继续移动。
17+
18+
返回达到方格 N*N 所需的最少移动次数,如果不可能,则返回 ```-1```
19+
20+
 
21+
22+
**示例:**
23+
```
24+
输入:[
25+
[-1,-1,-1,-1,-1,-1],
26+
[-1,-1,-1,-1,-1,-1],
27+
[-1,-1,-1,-1,-1,-1],
28+
[-1,35,-1,-1,13,-1],
29+
[-1,-1,-1,-1,-1,-1],
30+
[-1,15,-1,-1,-1,-1]]
31+
输出:4
32+
解释:
33+
首先,从方格 1 [第 5 行,第 0 列] 开始。
34+
你决定移动到方格 2,并必须爬过梯子移动到到方格 15。
35+
然后你决定移动到方格 17 [第 3 行,第 4 列],必须爬过蛇到方格 13。
36+
然后你决定移动到方格 14,且必须通过梯子移动到方格 35。
37+
然后你决定移动到方格 36, 游戏结束。
38+
可以证明你需要至少 4 次移动才能到达第 N*N 个方格,所以答案是 4。
39+
```
40+
41+
**提示:**
42+
43+
* ```2 <= board.length = board[0].length <= 20```
44+
* ```board[i][j]``` 介于 ```1``` 和 ```N*N``` 之间或者等于 ```-1```
45+
* 编号为 ```1``` 的方格上没有蛇或梯子。
46+
* 编号为 ```N*N``` 的方格上没有蛇或梯子。
47+
48+
来源:力扣(LeetCode)
49+
链接:https://leetcode-cn.com/problems/snakes-and-ladders
50+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

0909.蛇梯棋/solution.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
const int MAXN=20;
2+
int vis[MAXN*MAXN+1];
3+
const int MAXS=6;
4+
const int INF=0x3f3f3f3f;
5+
class Solution {
6+
public:
7+
int snakesAndLadders(vector<vector<int>>& board) {
8+
int n=board.size();
9+
int tar=n*n;
10+
vector<int> vec;
11+
vec.reserve(n*n+1);
12+
vec.push_back(0);
13+
int j=-1,step=-1;
14+
for (int i=n-1;i>=0;i--) {
15+
step*=-1;
16+
for (j= j==-1 ? 0 : n-1;j>=0 && j<n;j+=step) {
17+
vec.push_back(board.at(i).at(j));
18+
}
19+
}
20+
queue<int> que;
21+
que.push(1);
22+
memset(vis,0x3f,sizeof(vis));
23+
vis[1]=0;
24+
while (!que.empty()) {
25+
int cur=que.front();
26+
que.pop();
27+
for (int s=1;s<=MAXS;s++) {
28+
int nxt=cur+s;
29+
if (vec.at(nxt)!=-1) {
30+
nxt=vec.at(nxt);
31+
}
32+
if (vis[nxt]!=INF) {
33+
continue;
34+
}
35+
vis[nxt]=vis[cur]+1;
36+
if (nxt==tar) {
37+
return vis[nxt];
38+
}
39+
que.push(nxt);
40+
}
41+
}
42+
return -1;
43+
}
44+
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
给你一个 **从 0 开始的排列** ```nums```**下标也从 0 开始**)。请你构建一个 **同样长度** 的数组 ```ans``` ,其中,对于每个 ```i(0 <= i < nums.length)```,都满足 ```ans[i] = nums[nums[i]]``` 。返回构建好的数组 ```ans```
2+
3+
**从 0 开始的排列** ```nums``` 是一个由 ```0``` 到 ```nums.length - 1``````0``````nums.length - 1``` 也包含在内)的不同整数组成的数组。
4+
5+
 
6+
7+
**示例 1:**
8+
```
9+
输入:nums = [0,2,1,5,3,4]
10+
输出:[0,1,2,4,5,3]
11+
解释:数组 ans 构建如下:
12+
ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]
13+
= [nums[0], nums[2], nums[1], nums[5], nums[3], nums[4]]
14+
= [0,1,2,4,5,3]
15+
```
16+
**示例 2:**
17+
```
18+
输入:nums = [5,0,1,2,3,4]
19+
输出:[4,5,0,1,2,3]
20+
解释:数组 ans 构建如下:
21+
ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]
22+
= [nums[5], nums[0], nums[1], nums[2], nums[3], nums[4]]
23+
= [4,5,0,1,2,3]
24+
```
25+
26+
**提示:**
27+
28+
* ```1 <= nums.length <= 1000```
29+
* ```0 <= nums[i] < nums.length```
30+
* ```nums``` 中的元素 互不相同
31+
32+
来源:力扣(LeetCode)
33+
链接:https://leetcode-cn.com/problems/build-array-from-permutation
34+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution {
2+
public:
3+
vector<int> buildArray(vector<int>& nums) {
4+
int sz=nums.size();
5+
vector<int> ans(sz);
6+
for (int i=0;i<sz;i++) {
7+
ans.at(i)=nums.at(nums.at(i));
8+
}
9+
return ans;
10+
}
11+
};
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个 **下标从 0 开始** 且长度为 ```n``` 的整数数组 ```dist``` ,其中 ```dist[i]``` 是第 ```i``` 个怪物与城市的 **初始距离**(单位:米)。
2+
3+
怪物以 **恒定** 的速度走向城市。给你一个长度为 ```n``` 的整数数组 ```speed``` 表示每个怪物的速度,其中 ```speed[i]``` 是第 ```i``` 个怪物的速度(单位:米/分)。
4+
5+
怪物从 **第 0 分钟** 时开始移动。你有一把武器,并可以 **选择** 在每一分钟的开始时使用,包括第 0 分钟。但是你无法在一分钟的中间使用武器。这种武器威力惊人,一次可以消灭任一还活着的怪物。
6+
7+
一旦任一怪物到达城市,你就输掉了这场游戏。如果某个怪物 **** 在某一分钟开始时到达城市,这会被视为 **输掉** 游戏,在你可以使用武器之前,游戏就会结束。
8+
9+
返回在你输掉游戏前可以消灭的怪物的 **最大** 数量。如果你可以在所有怪物到达城市前将它们全部消灭,返回  ```n```
10+
11+
 
12+
13+
**示例 1:**
14+
```
15+
输入:dist = [1,3,4], speed = [1,1,1]
16+
输出:3
17+
解释:
18+
第 0 分钟开始时,怪物的距离是 [1,3,4],你消灭了第一个怪物。
19+
第 1 分钟开始时,怪物的距离是 [X,2,3],你没有消灭任何怪物。
20+
第 2 分钟开始时,怪物的距离是 [X,1,2],你消灭了第二个怪物。
21+
第 3 分钟开始时,怪物的距离是 [X,X,1],你消灭了第三个怪物。
22+
所有 3 个怪物都可以被消灭。
23+
```
24+
**示例 2:**
25+
```
26+
输入:dist = [1,1,2,3], speed = [1,1,1,1]
27+
输出:1
28+
解释:
29+
第 0 分钟开始时,怪物的距离是 [1,1,2,3],你消灭了第一个怪物。
30+
第 1 分钟开始时,怪物的距离是 [X,0,1,2],你输掉了游戏。
31+
你只能消灭 1 个怪物。
32+
```
33+
**示例 3:**
34+
```
35+
输入:dist = [3,2,4], speed = [5,3,2]
36+
输出:1
37+
解释:
38+
第 0 分钟开始时,怪物的距离是 [3,2,4],你消灭了第一个怪物。
39+
第 1 分钟开始时,怪物的距离是 [X,0,2],你输掉了游戏。
40+
你只能消灭 1 个怪物。
41+
```
42+
43+
**提示:**
44+
45+
* ```n == dist.length == speed.length```
46+
* ```1 <= n <= 10^5```
47+
* ```1 <= dist[i], speed[i] <= 10^5```
48+
49+
来源:力扣(LeetCode)
50+
链接:https://leetcode-cn.com/problems/eliminate-maximum-number-of-monsters
51+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const int MAXN=1e5+5;
2+
int cnt[MAXN];
3+
class Solution {
4+
public:
5+
int eliminateMaximum(vector<int>& dist, vector<int>& speed) {
6+
memset(cnt,0,sizeof(cnt));
7+
int sz=dist.size();
8+
for (int i=0;i<sz;i++) {
9+
int cur=dist.at(i)/speed.at(i);
10+
if (cur*speed.at(i)!=dist.at(i)) {
11+
cur++;
12+
}
13+
cnt[cur]++;
14+
}
15+
int sco=0;
16+
int ans=0;
17+
for (int i=0;i<MAXN;i++) {
18+
if (cnt[i]==0) {
19+
sco++;
20+
continue;
21+
}
22+
ans+=min(cnt[i],sco);
23+
sco-=cnt[i];
24+
if (sco<0) {
25+
return ans;
26+
}
27+
sco++;
28+
}
29+
return ans;
30+
}
31+
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
我们称一个数字字符串是 **好数字** 当它满足(下标从 ```0``` 开始)**偶数** 下标处的数字为 **偶数** 且 **奇数** 下标处的数字为 **质数** (```2,3,5 或 7```)。
2+
3+
* 比方说,"```2582```" 是好数字,因为偶数下标处的数字(```2 和 8```)是偶数且奇数下标处的数字(```5 和 2```)为质数。但 "```3245```**不是** 好数字,因为 ```3``` 在偶数下标处但不是偶数。
4+
5+
给你一个整数 ```n``` ,请你返回长度为 ```n``` 且为好数字的数字字符串 **总数** 。由于答案可能会很大,请你将它对 ```10^9 + 7``` 取余后返回 。
6+
7+
一个 **数字字符串** 是每一位都由 0 到 9 组成的字符串,且可能包含前导 0 。
8+
9+
 
10+
11+
**示例 1:**
12+
```
13+
输入:n = 1
14+
输出:5
15+
解释:长度为 1 的好数字包括 "0","2","4","6","8" 。
16+
```
17+
**示例 2:**
18+
```
19+
输入:n = 4
20+
输出:400
21+
```
22+
**示例 3:**
23+
```
24+
输入:n = 50
25+
输出:564908303
26+
```
27+
28+
**提示**
29+
30+
* ```1 <= n <= 10^15```
31+
32+
来源:力扣(LeetCode)
33+
链接:https://leetcode-cn.com/problems/count-good-numbers
34+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
typedef long long ll;
2+
ll mod=1e9+7;
3+
class Solution {
4+
public:
5+
int countGoodNumbers(long long n) {
6+
ll half=n/2;
7+
return quick_pow2(4,half)*quick_pow2(5,n-half)%mod;
8+
}
9+
long long quick_pow2(long long a,long long n)
10+
{
11+
if (n<0)
12+
{
13+
cerr << "error quick pow" << endl;
14+
return -1;
15+
}
16+
if (a==0)
17+
return 0;
18+
a%=mod;
19+
long long ans=1;
20+
while (n!=0)
21+
{
22+
if ((n&1)==1)
23+
{
24+
ans*=a;
25+
ans%=mod;
26+
}
27+
a*=a;
28+
a%=mod;
29+
n>>=1;
30+
}
31+
return ans;
32+
}
33+
};

0 commit comments

Comments
 (0)