​LeetCode #160 周赛​


leetcode 题目不同于其他 oj 是黑盒测试,要提交完整可运行代码,而是完善封装好题目给出的函数即可

1237、找出给定方程的正整数解

题目:给出函数 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_i++,和整数 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_i++_02。求所有满足 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_i++_03LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_黑盒测试_04

分析:由于 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_黑盒测试_05 范围 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_i++_06

class Solution {
public:
vector<vector<int>> findSolution(CustomFunction& customfunction, int z) {
vector<vector<int>> v;
for (int i = 1; i <= 1e3; i++) {
for (int j = 1; j <= 1e3; j++) {
if (customfunction.f(i, j) == z) {
v.push_back({i, j});
}
}
}
return v;
}
};

1238、循环码排列

题目: 给出 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_字符串_07,要求输出以 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_黑盒测试_08 开头的 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_黑盒测试_09 的排列,且排列要满足相邻两数的二进制表示相差一位

分析:​​格雷码​​(循环二进制单位距离码)是任意两个相邻数的代码只有一位二进制数不同的编码,。

LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_i++_10


①、通过模拟(上下镜射加新位):

class Solution {
public:
vector<int> circularPermutation(int n, int start) {
vector<int> v = {0, 1}, res;
for (int i = 2; i <= n; i++) {
for (int j = v.size() - 1; j >= 0; j--) {
v.push_back(v[j] + (1 << (i-1)));
}
}
int pos = find(v.begin(), v.end(), start) - v.begin();
int m = v.size();
while (m--) {
res.push_back(v[pos]); pos = (pos + 1) % v.size();
}
return res;
}
};

LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_字符串_11


②、通过分析二进制表示:

class Solution {
public:
vector<int> circularPermutation(int n, int start) {
vector<int> v, res;
int pos;
for (int i = 0; i < 1 << n; i++) {
v.push_back(i ^ (i >> 1));
if (v.back() == start) pos = i;
}
int m = v.size();
while (m--) {
res.push_back(v[pos]); pos = (pos + 1) % v.size();
}
return res;
}
};

1239、串联字符串的最大长度

题目:给一个字符串数组 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_字符串_12,选择数组 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_字符串_12 的子序列组成新的字符串 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_黑盒测试_14,但 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_黑盒测试_14 种不能有重复字符,求 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_黑盒测试_14

分析:暴力 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_黑盒测试_17 每一位选或者不选,不过要加上剪枝:对于每一位,只有加上后没有重复字符才会继续。

class Solution {
public:
int dfs(vector<string>& arr, string str, int pos, int* vis) {
if (pos == arr.size()) return str.size();
int ans = dfs(arr, str, pos + 1, vis); // 不选当前位置
int tmp[30];
for (int i = 0; i < 30; i++) tmp[i] = vis[i]; // 递归时会改变指针,所以要备份
for (auto x : arr[pos]) { // 选当前位置,但不能有重复
if (tmp[x - 'a'] == 1) return ans;
else tmp[x - 'a'] = 1;
}
return max(dfs(arr, str + arr[pos], pos + 1, tmp), ans); // 取最大
}

int maxLength(vector<string>& arr) {
int vis[30] = {0};
return dfs(arr, "", 0, vis);
}
};

1240、铺瓷砖

题目:给你 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_i++_18 矩阵,让你分割成若干正方形,求最小分割数。 LeetCode #160 周赛题解(暴力 + 格雷码 + DFS + 矩阵最小正方形剖分)_字符串_19

分析:​​矩阵最小正方形剖分​