LeetCode Weekly Contest 262

LeetCode Weekly Contest 262

第一次参加leetcode周赛,做出来两道题,排名2124 / 4260

2032. 至少在两个数组中出现的值

给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 不同 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。

示例 1:

输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3]
输出:[3,2]
解释:至少在两个数组中出现的所有值为:

  • 3 ,在全部三个数组中都出现过。
  • 2 ,在数组 nums1 和 nums2 中出现过。
    示例 2:

输入:nums1 = [3,1], nums2 = [2,3], nums3 = [1,2]
输出:[2,3,1]
解释:至少在两个数组中出现的所有值为:

  • 2 ,在数组 nums2 和 nums3 中出现过。
  • 3 ,在数组 nums1 和 nums2 中出现过。
  • 1 ,在数组 nums1 和 nums3 中出现过。
    示例 3:

输入:nums1 = [1,2,2], nums2 = [4,3,3], nums3 = [5]
输出:[]
解释:不存在至少在两个数组中出现的值。

1 <= nums1.length, nums2.length, nums3.length <= 100
1 <= nums1[i], nums2[j], nums3[k] <= 100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* 
审题:
由于数字范围为1到100,那我先将三个数组压入三个不同的hash表,
然后遍历1到100,用O(3)的复杂度判断该数字是否在三个hash表中,
把结果累加输出,总复杂度是O(n1 + n2 + n3 + 3 * 100)
*/

vector<int> twoOutOfThree(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3) {
unordered_map<int, int> numMap1;
unordered_map<int, int> numMap2;
unordered_map<int, int> numMap3;
for (auto i = 0; i < nums1.size(); i++) {
auto num = nums1[i];
numMap1[num]++;
}
for (auto i = 0; i < nums2.size(); i++) {
auto num = nums2[i];
numMap2[num]++;
}
for (auto i = 0; i < nums3.size(); i++) {
auto num = nums3[i];
numMap3[num]++;
}
vector<int> result;
for (int i = 1; i <= 100; i++) {
int numCount = 0;
numCount += static_cast<bool>(numMap1.count(i)) + static_cast<bool>(numMap2.count(i)) + static_cast<bool>(numMap3.count(i));
if (numCount > 1) {
result.push_back(i);
}
}
return result;
}

2033. 获取单值网格的最小操作数

给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x 。

单值网格 是全部元素都相等的网格。

返回使网格化为单值网格所需的 最小 操作数。如果不能,返回 -1 。

示例 1:

输入:grid = [[2,4],[6,8]], x = 2
输出:4
解释:可以执行下述操作使所有元素都等于 4 :

  • 2 加 x 一次。
  • 6 减 x 一次。
  • 8 减 x 两次。
    共计 4 次操作。
    示例 2:

输入:grid = [[1,5],[2,3]], x = 1
输出:5
解释:可以使所有元素都等于 3 。
示例 3:

输入:grid = [[1,2],[3,4]], x = 2
输出:-1
解释:无法使所有元素相等。

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 105
1 <= m * n <= 105
1 <= x, grid[i][j] <= 104

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
审题:这题不会
看了解析,取中位数,然后遍历所有元素做差看是否能整除x
*/

int minOperations(vector<vector<int>>& grd, int x) {
int n = grd.size();
int m = grd[0].size();
vector<int> cnt(n * m);
int index = 0;
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
cnt[index++] = grd[i][j];
}
}
sort(cnt.begin(), cnt.end());
int t = cnt.size()/ 2;
int res = 0;
for(int i = 0; i < cnt.size(); i ++){
if(cnt[i] != cnt[t]) {
int k = abs(cnt[i] - cnt[t]);
if(k % x == 0) {
res += k / x;
}
else return -1;
}
}
return res;
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×