调和级数 3447

Medium
 
Topics
 
Companies
 
Hint

You are given an integer array groups, where groups[i] represents the size of the ith group. You are also given an integer array elements.

Your task is to assign one element to each group based on the following rules:

  • An element j can be assigned to a group i if groups[i] is divisible by elements[j].
  • If there are multiple elements that can be assigned, assign the element with the smallest index j.
  • If no element satisfies the condition for a group, assign -1 to that group.

Return an integer array assigned, where assigned[i] is the index of the element chosen for group i, or -1 if no suitable element exists.

Note: An element may be assigned to more than one group.

 

Example 1:

Input: groups = [8,4,3,2,4], elements = [4,2]

Output: [0,0,-1,1,0]

Explanation:

  • elements[0] = 4 is assigned to groups 0, 1, and 4.
  • elements[1] = 2 is assigned to group 3.
  • Group 2 cannot be assigned any element.

Example 2:

Input: groups = [2,3,5,7], elements = [5,3,3]

Output: [-1,1,0,-1]

Explanation:

  • elements[1] = 3 is assigned to group 1.
  • elements[0] = 5 is assigned to group 2.
  • Groups 0 and 3 cannot be assigned any element.

Example 3:

Input: groups = [10,21,30,41], elements = [2,1]

Output: [0,1,0,1]

Explanation:

elements[0] = 2 is assigned to the groups with even values, and elements[1] = 1 is assigned to the groups with odd values.

Constraints:

  • 1 <= groups.length <= 105
  • 1 <= elements.length <= 105
  • 1 <= groups[i] <= 105
  • 1 <= elements[i] <= 105
class Solution {
    public int[] assignElements(int[] groups, int[] elements) {
        // 找到group中的最大值
        int max = 0;
        for(int ele : groups) {
            max = Math.max(max, ele);
        }
        // 创建字典,遍历elements,填入dict
        int[] dict = new int[max + 1];
        Arrays.fill(dict, -1);
        for(int i = 0; i < elements.length; i++) {
            int num = elements[i];
            // 如果超出了group最大值 直接不用考虑
            // 如果已经被标记,说明它的约数已经在它前面,比如[2,4] 到4的时候,其实2已经标记过了
            if(num > max || dict[num] != -1) continue;
            // 对num的倍数进行标记
            for(int j = num; j <= max; j = j + num) {
                if(dict[j] != -1) continue;
                dict[j] = i;
            }
        }
        // 根据dict 对groups的数据填表,返回结果
        int[] result = new int[groups.length];
        for(int i = 0; i < groups.length; i++) {
           result[i] = dict[groups[i]];
        }
        return result;
    }
}

 

posted @ 2025-02-16 08:15  xiaoyongyong  阅读(13)  评论(0)    收藏  举报