英文原文
Given three integer arrays
nums1
, nums2
, and nums3
, return a distinct array containing all the values that are present in at least two out of the three arrays. You may return the values in any order.
Example 1:
Input: nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3] Output: [3,2] Explanation: The values that are present in at least two arrays are: - 3, in all three arrays. - 2, in nums1 and nums2.
Example 2:
Input: nums1 = [3,1], nums2 = [2,3], nums3 = [1,2] Output: [2,3,1] Explanation: The values that are present in at least two arrays are: - 2, in nums2 and nums3. - 3, in nums1 and nums2. - 1, in nums1 and nums3.
Example 3:
Input: nums1 = [1,2,2], nums2 = [4,3,3], nums3 = [5] Output: [] Explanation: No value is present in at least two arrays.
Constraints:
1 <= nums1.length, nums2.length, nums3.length <= 100
1 <= nums1[i], nums2[j], nums3[k] <= 100
中文题目
给你三个整数数组
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
通过代码
高赞题解
用100个int记录每个可能出现的数字的状态,每个数字的状态按如下编码:
- 0:不出现
- 1:在nums1中出现
- 2:在nums2中出现
- 3:在nums3中出现
- 4:在nums1、2中出现
- 5:在nums1、3中出现
- 6:在nums2、3中出现
- 大于7:在nums1、2、3中出现
遍历nums1
此时数组中均为状态0,对int x:nums
,cache[x]
的值由0->1
遍历nums2
此时数组中状态为0,1。开始遍历,按照
- 0->2
- 1->4
进行值的更新,对于nums2重复出现的数字,之前已经进行过状态更新,所以当遇到状态为2,4,说明已经更新过该数字的状态,跳过:
if (cache[x] <= 1)
。若更新后状态为4,符合题意,加入res。
遍历nums3
对于状态0->3,不满足题意,忽略。状态4已经在遍历nums2中加入到结果中,忽略。对于其他所有状态,按照下列规则更新后,均符合题意。
- 1->5
- 2->6
class Solution {
public List<Integer> twoOutOfThree(int[] nums1, int[] nums2, int[] nums3) {
List<Integer> res = new ArrayList<>();
int[] cache = new int[101];
for (int x : nums1) {
cache[x] = 1;
}
for (int x : nums2) {
if (cache[x] <= 1) {
cache[x] += 1;
cache[x] <<= 1;
if(cache[x]==4) res.add(x);
}
}
for (int x : nums3) {
if (cache[x]==1||cache[x]==2){
cache[x]+=4;
res.add(x);
}
}
return res;
}
}
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
6505 | 9808 | 66.3% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|