2644-找出可整除性得分最大的整数

Raphael Liu Lv10

给你两个下标从 0 开始的整数数组 numsdivisors

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

Problem: 2644. 找出可整除性得分最大的整数

[TOC]

思路

讲述看到这一题的思路

解题方法

描述你的解题方法

复杂度

  • 时间复杂度:

    添加时间复杂度, 示例: O(n)

  • 空间复杂度:

    添加空间复杂度, 示例: O(n)

Code

[]
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

struct HashEntry {
int key;
int score;
UT_hash_handle hh;
};

void hashAddItem(struct HashEntry** obj, int key,int score) {
struct HashEntry* pEntry = NULL;
HASH_FIND_INT(*obj, &key, pEntry);
if (pEntry != NULL)
{
return;
}
else
{
pEntry = malloc(sizeof(struct HashEntry));
pEntry->key = key;
pEntry->score = score;
HASH_ADD_INT(*obj, key, pEntry);
}

}

int maxDivScore(int* nums, int numsSize, int* divisors, int divisorsSize){
struct HashEntry* cnt = NULL;
for(int i=0;i<divisorsSize;i++) //遍历,将每个divisor的score进行存储
{
int score=0;
for(int j=0;j<numsSize;j++)
{

if(nums[j]%divisors[i]==0)
{
score++;
}
}
hashAddItem(&cnt,divisors[i],score);

}
struct HashEntry* s;
int maxScore=0,ret=0;
for (s = cnt; s != NULL; s = s->hh.next) {
ret=s->score;
maxScore=(ret>maxScore?ret:maxScore);
}
int maxDivisor=INT_MAX;
for (s = cnt; s != NULL; s = s->hh.next) {
if(s->score==maxScore)
{
ret=s->key;
maxDivisor=(ret<maxDivisor?ret:maxDivisor);
}
}
return maxDivisor;
}
 Comments
On this page
2644-找出可整除性得分最大的整数