6350. 找出可整除性得分最大的整数
给你两个下标从 0 开始的整数数组 nums
和 divisors
。
divisors[i]
的 可整除性得分 等于满足 nums[j]
能被 divisors[i]
整除的下标 j
的数量。
返回 可整除性得分 最大的整数 divisors[i]
。如果有多个整数具有最大得分,则返回数值最小的一个。
示例 1:
输入:nums = [4,7,9,3,9], divisors = [5,2,3] 输出:3 解释:divisors 中每个元素的可整除性得分为: divisors[0] 的可整除性得分为 0 ,因为 nums 中没有任何数字能被 5 整除。 divisors[1] 的可整除性得分为 1 ,因为 nums[0] 能被 2 整除。 divisors[2] 的可整除性得分为 3 ,因为 nums[2]、nums[3] 和 nums[4] 都能被 3 整除。 因此,返回 divisors[2] ,它的可整除性得分最大。
示例 2:
输入:nums = [20,14,21,10], divisors = [5,7,5] 输出:5 解释:divisors 中每个元素的可整除性得分为: divisors[0] 的可整除性得分为 2 ,因为 nums[0] 和 nums[3] 都能被 5 整除。 divisors[1] 的可整除性得分为 2 ,因为 nums[1] 和 nums[2] 都能被 7 整除。 divisors[2] 的可整除性得分为 2 ,因为 nums[0] 和 nums[3] 都能被5整除。 由于 divisors[0]、divisors[1] 和 divisors[2] 的可整除性得分都是最大的,因此,我们返回数值最小的一个,即 divisors[2] 。
示例 3:
输入:nums = [12], divisors = [10,16] 输出:10 解释:divisors 中每个元素的可整除性得分为: divisors[0] 的可整除性得分为 0 ,因为 nums 中没有任何数字能被 10 整除。 divisors[1] 的可整除性得分为 0 ,因为 nums 中没有任何数字能被 16 整除。 由于 divisors[0] 和 divisors[1] 的可整除性得分都是最大的,因此,我们返回数值最小的一个,即 divisors[0] 。
提示:
1 <= nums.length, divisors.length <= 1000
1 <= nums[i], divisors[i] <= 109
原站题解
java 解法, 执行用时: 70 ms, 内存消耗: 44.2 MB, 提交时间: 2024-05-18 10:04:12
class Solution { public int maxDivScore(int[] nums, int[] divisors) { Arrays.sort(nums); int n = nums.length; int dup = 0; for (int i = 1; i < n; i++) { if (nums[i] == nums[i - 1]) { dup++; } } Arrays.sort(divisors); int ans = 0; int maxCnt = -1; for (int d : divisors) { if (maxCnt - dup >= nums[n - 1] / d) { break; } int cnt = 0; for (int i = n - 1; i >= 0; i--) { int x = nums[i]; if (x < d) { break; } if (x % d == 0) { cnt++; } } if (cnt > maxCnt) { maxCnt = cnt; ans = d; } } return ans; } }
java 解法, 执行用时: 176 ms, 内存消耗: 44 MB, 提交时间: 2024-05-18 10:03:47
class Solution { public int maxDivScore(int[] nums, int[] divisors) { int ans = 0; int maxCnt = -1; for (int d : divisors) { int cnt = 0; for (int x : nums) { if (x % d == 0) { cnt++; } } if (cnt > maxCnt || cnt == maxCnt && d < ans) { maxCnt = cnt; ans = d; } } return ans; } }
cpp 解法, 执行用时: 296 ms, 内存消耗: 31.2 MB, 提交时间: 2024-05-18 10:03:17
class Solution { public: int maxDivScore(vector<int>& nums, vector<int>& divisors) { int cnt = -1, ans = 0; for (int i = 0; i < divisors.size(); i++) { int tmp = 0; for (int j = 0; j < nums.size(); j++) { if (nums[j] % divisors[i] == 0) { tmp++; } } if (tmp > cnt || (tmp == cnt && divisors[i] < ans)) { ans = divisors[i]; cnt = tmp; } } return ans; } };
rust 解法, 执行用时: 180 ms, 内存消耗: 2.2 MB, 提交时间: 2023-09-13 14:54:42
impl Solution { // 常规解法 pub fn max_div_score(nums: Vec<i32>, divisors: Vec<i32>) -> i32 { let mut ans = -1; let mut count = -1; for d in divisors { let mut tmp = 0; for &n in nums.iter() { if n % d == 0 { tmp += 1; } } if tmp > count || (tmp == count && ans > d) { count = tmp; ans = d; } } ans } // 函数式解法 pub fn max_div_score2(nums: Vec<i32>, divisors: Vec<i32>) -> i32 { divisors.into_iter() .map(|x| (nums.iter().filter(|&&y|y % x == 0).count(), x )) .max_by_key(|(score, div)| (*score, -*div)) .unwrap() .1 } }
php 解法, 执行用时: 924 ms, 内存消耗: 18.9 MB, 提交时间: 2023-09-13 14:39:05
class Solution { /** * @param Integer[] $nums * @param Integer[] $divisors * @return Integer */ function maxDivScore($nums, $divisors) { $maxCnt = -1; $ans = 0; foreach ( $divisors as $d ) { $cnt = 0; foreach ( $nums as $x ) { if ( $x % $d == 0 ) $cnt++; } if ( $cnt > $maxCnt || $cnt == $maxCnt && $d < $ans ) { $maxCnt = $cnt; $ans = $d; } } return $ans; } }
python3 解法, 执行用时: 5328 ms, 内存消耗: 15.2 MB, 提交时间: 2023-04-17 16:37:42
from functools import lru_cache class Solution: def maxDivScore(self, nums: List[int], divisors: List[int]) -> int: @lru_cache(None) def count_score(divisor): return sum(n%divisor==0 for n in nums) return max(divisors, key=lambda x: (count_score(x), -x))
golang 解法, 执行用时: 324 ms, 内存消耗: 6.8 MB, 提交时间: 2023-04-17 16:37:14
func maxDivScore(nums, divisors []int) (ans int) { maxCnt := -1 for _, d := range divisors { cnt := 0 for _, x := range nums { if x%d == 0 { cnt++ } } if cnt > maxCnt || cnt == maxCnt && d < ans { maxCnt, ans = cnt, d } } return }
python3 解法, 执行用时: 5264 ms, 内存消耗: 15.1 MB, 提交时间: 2023-04-17 16:36:42
class Solution: def maxDivScore(self, nums: List[int], divisors: List[int]) -> int: max_cnt, ans = -1, 0 for d in divisors: cnt = sum(x % d == 0 for x in nums) if cnt > max_cnt or cnt == max_cnt and d < ans: max_cnt, ans = cnt, d return ans