Leetcode Weekly Contest 86
A:840. 矩阵中的幻方
3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。
给定一个由整数组成的 N × N 矩阵,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。
直接模拟即可,本来是签到题,由于粗心,浪费了时间。
1 class Solution { 2 public: 3 int numMagicSquaresInside(vector<vector<int>>& grid) { 4 vector<vector<int> >a = grid; 5 int ans = 0; 6 for(int i = 0; i + 2 < a.size(); i++) 7 { 8 for(int j = 0; j + 2 < a[0].size(); j++) 9 { 10 set<int>s; 11 bool flag = 1; 12 for(int ii = i; ii <= i + 2; ii++) 13 { 14 for(int jj = j; jj <= j + 2; jj++) 15 { 16 if(a[ii][jj] >= 10 || a[ii][jj] <= 0) 17 { 18 flag = 0; 19 } 20 s.insert(a[ii][jj]); 21 } 22 } 23 if(flag && s.size() == 9) 24 { 25 int a1 = a[i][j] + a[i + 1][j + 1] + a[i + 2][j + 2]; 26 int a2 = a[i][j + 2] + a[i + 1][j + 1] + a[i + 2][j]; 27 //cout<<a1<<" "<<a2<<endl; 28 if(a1 == a2 && a1 == 15) 29 { 30 for(int ii = i; ii <= i + 2; ii++) 31 { 32 int a3 = a[ii][j] + a[ii][j + 1] + a[ii][j + 2]; 33 if(a3 != 15)flag = 0; 34 } 35 for(int ii = j; ii <= j + 2; ii++) 36 { 37 int a3 = a[i][ii] + a[i + 1][ii] + a[i + 2][ii]; 38 if(a3 != 15)flag = 0; 39 } 40 if(flag)ans++; 41 } 42 } 43 } 44 } 45 return ans; 46 } 47 };
B:841. 钥匙和房间
有 N
个房间,开始时你位于 0
号房间。每个房间有不同的号码:0,1,2,...,N-1
,并且房间里可能有一些钥匙能使你进入下一个房间。
在形式上,对于每个房间 i
都有一个钥匙列表 rooms[i]
,每个钥匙 rooms[i][j]
由 [0,1,...,N-1]
中的一个整数表示,其中 N = rooms.length
。 钥匙 rooms[i][j] = v
可以打开编号为 v
的房间。
最初,除 0
号房间外的其余所有房间都被锁住。
你可以自由地在房间之间来回走动。
如果能进入每个房间返回 true
,否则返回 false
。
直接用BFS即可,到达每一点,比赛的时候用并查集也过了,但是后来想这是有向边,并查集合并的是无向边,应该是数据水的原因
1 class Solution { 2 public: 3 bool canVisitAllRooms(vector<vector<int> >& rooms) { 4 queue<int>q; 5 q.push(0); 6 int vis[1005] = {0}; 7 while(!q.empty()) 8 { 9 int now = q.front(); 10 q.pop(); 11 for(int i = 0; i < rooms[now].size(); i++) 12 { 13 int next = rooms[now][i]; 14 if(!vis[next]) 15 { 16 vis[next] = 1; 17 q.push(next); 18 } 19 } 20 } 21 for(int i = 1; i < rooms.size(); i++) 22 { 23 if(vis[i] == 0)return false; 24 } 25 return true; 26 } 27 };
C:842. 将数组拆分成斐波那契序列
给定一个数字字符串 S
,比如 S = "123456579"
,我们可以将它分成斐波那契式的序列 [123, 456, 579]
。
形式上,斐波那契式序列是一个非负整数列表 F
,且满足:
0 <= F[i] <= 2^31 - 1
,(也就是说,每个整数都符合 32 位有符号整数类型);F.length >= 3
;- 对于所有的
0 <= i < F.length - 2
,都有F[i] + F[i+1] = F[i+2]
成立。
另外,请注意,将字符串拆分成小块时,每个块的数字一定不要以零开头,除非这个块是数字 0 本身。
返回从 S
拆分出来的所有斐波那契式的序列块,如果不能拆分则返回 []
。
枚举第一项和第二项的位数即可,保证没有前导0,还需要保证以后的每一项在2的31次方以内
1 class Solution { 2 public: 3 vector<int> splitIntoFibonacci(string S) { 4 for(int i = 1; i <= min(10, (int)S.size()); i++) 5 { 6 for(int j = 1; j <= min(10, (int)S.size()); j++) 7 { 8 if(i + j - 1 >= S.size())break; 9 string s1, s2; 10 for(int k = 0; k < i; k++)s1 += S[k]; 11 for(int k = i; k < i + j; k++)s2 += S[k]; 12 if(s1[0] == '0' && i != 1 || s2[0] == '0' && j != 1)continue; 13 vector<int>ans; 14 string tmp = s1 + s2; 15 stringstream ss(s1), ss1(s2); 16 long long a, b, c; 17 ss >> a;ss1 >> b; 18 ans.push_back(a); 19 ans.push_back(b); 20 while(1) 21 { 22 c = a + b; 23 if(c >= (1LL<<31)) 24 { 25 break; 26 } 27 ans.push_back(c); 28 stringstream ss; 29 ss << c; 30 string s3; 31 ss >> s3; 32 tmp += s3; 33 if(tmp.size() > S.size())break; 34 if(tmp == S)return ans; 35 a = b; 36 b = c; 37 } 38 } 39 } 40 vector<int>ans; 41 return ans; 42 } 43 };
D:843. 猜猜这个单词
这个问题是 LeetCode 平台新增的交互式问题 。
我们给出了一个由一些独特的单词组成的单词列表,每个单词都是 6 个字母长,并且这个列表中的一个单词将被选作秘密。
你可以调用 master.guess(word)
来猜单词。你所猜的单词应当是存在于原列表并且由 6 个小写字母组成的类型字符串
。
此函数将会返回一个整型数字
,表示你的猜测与秘密单词的准确匹配(值和位置同时匹配)的数目。此外,如果你的猜测不在给定的单词列表中,它将返回 -1
。
对于每个测试用例,你有 10 次机会来猜出这个单词。当所有调用都结束时,如果您对 master.guess
的调用不超过 10 次,并且至少有一次猜到秘密,那么您将通过该测试用例。
除了下面示例给出的测试用例外,还会有 5 个额外的测试用例,每个单词列表中将会有 100 个单词。这些测试用例中的每个单词的字母都是从 'a'
到 'z'
中随机选取的,并且保证给定单词列表中的每个单词都是唯一的。
一开始以为是难题,后来发现就是水题一个,直接模拟即可,每次随机询问一个位置即可,得到答案为t,把字符串数组中与该位置有t个相同的字符串作为下一组字符串数组继续查询。
1 /** 2 * // This is the Master's API interface. 3 * // You should not implement it, or speculate about its implementation 4 * class Master { 5 * public: 6 * int guess(string word); 7 * }; 8 */ 9 class Solution { 10 public: 11 int judge(string a, string b) 12 { 13 int tot = 0; 14 for(int i = 0; i < a.size(); i++) 15 { 16 if(a[i] == b[i])tot++; 17 } 18 return tot; 19 } 20 void findSecretWord(vector<string>& wordlist, Master& master) { 21 vector<string>now = wordlist, next; 22 while(1) 23 { 24 next.clear(); 25 int s = rand()%now.size(); 26 int t = master.guess(now[s]); 27 if(t == 6)break; 28 for(int i = 0; i < now.size(); i++) 29 { 30 if(judge(now[i], now[s]) == t) 31 next.push_back(now[i]); 32 } 33 now = next; 34 } 35 } 36 };