查找出现至少k次的最小整数

问题描述

为您提供了一个整数数组A和一个整数k。实现一种算法,该算法以线性时间确定在A中出现至少k次的最小整数。

我一直在为这个问题而苦苦挣扎,用Java进行编码,我需要使用HashTable来查找出现至少k次的最小整数,它也必须是线性时间。

这是我尝试过的,但是没有通过任何测试

individuals

这是所有测试用例的空代码

private static int problem1(int[] arr,int k)
    {
        // Implement me!
    HashMap<Integer,Integer> table = new HashMap<Integer,Integer>();
    int ans = Integer.MAX_VALUE;
    for (int i=0; i < arr.length; i++) {
        if(table.containsKey(arr[i])) {
            table.put(arr[i],table.get(arr[i]) + 1);
            if (k <= table.get(arr[i])) {
                ans = Math.min(ans,arr[i]);
            }
        }else{
            table.put(arr[i],1);
        }
    }

        return ans;
    }

解决方法

private static int problem1(int[] arr,int k) {
        // Implement me!
        Map<Integer,Integer> table = new TreeMap<Integer,Integer>();
        for (int i = 0; i < arr.length; i++) {
            if (table.containsKey(arr[i])) {
                table.put(arr[i],table.get(arr[i]) + 1);
            } else {
                table.put(arr[i],1);
            }
        }
        for (Map.Entry<Integer,Integer> entry : table.entrySet()) { 
            //As treemap is sorted,we return the first key with value >=k.
            if(entry.getValue()>=k)
                return entry.getKey();
        }
        
        //Not found
        return -1;
    }
,

正如其他人指出的那样,有一些错误。首先,您初始化ans的行,

int ans = 0;

您应将ans初始化为Integer.MAX_VALUE,以便在找到一个k首次被适当设置为该整数的整数时,至少出现ans次。其次,在for循环中,没有理由在迭代数组时跳过第一个元素,因此i应该初始化为0而不是1。另外,在同一行中,您要遍历整个数组,并且在循环条件下,当i < k不是数组的长度时,您现在拥有k。数组的长度用arr.length表示,因此条件应改为i < arr.length。第三,在这一行,

if (k < table.get(arr[i])){

在尝试遍历数组时,到目前为止要检查整数是否在数组中至少发生k次,<运算符应更改为<=,因为此处的关键字是至少k次,而不是“超过k次”。第四,k永不更改,因此您可以摆脱这一行代码,

k = table.get(arr[i]);

应用所有这些更改之后,您的函数应如下所示:

private static int problem1(int[] arr,int k)
{
    // Implement me!
    HashMap<Integer,Integer> table = new HashMap<Integer,Integer>();
    int ans = Integer.MAX_VALUE;
    for (int i=0; i < arr.length; i++) {
        if(table.containsKey(arr[i])) {
            table.put(arr[i],table.get(arr[i]) + 1);
            if (k <= table.get(arr[i])) {
                ans = Math.min(ans,arr[i]);
            }
        }else{
            table.put(arr[i],1);
        }
    }

    return ans;
}
,

伪代码:

  • 收集class DisableWidget extends StatelessWidget { final Widget child; final bool disable; const DisableWidget({ Key key,this.child,this.disable = false,}) : super(key: key); Widget build(BuildContext context) { return disable ? ColorFiltered( colorFilter: ColorFilter.mode(Colors.grey,BlendMode.saturation),child: AbsorbPointer(absorbing: true,ignoringSemantics: true,child: child),) : child; } } 中每个数字的频率(数字及其计数)
  • 至少设置一个大值
  • 重复条目
    • 忽略其值小于Map<Integer,Integer>的条目
    • 如果输入密钥小于当前最小密钥,则至少存储一次
  • 最少退回

单行实现:

k
,

这能够通过所有案件!谢谢所有帮助过的人!

private static int problem1(int[] arr,int k)
    {
    // Implement me!
        HashMap<Integer,Integer>();
        int ans = Integer.MAX_VALUE;
        for (int i=0; i < arr.length; i++) {
            if(table.containsKey(arr[i])) {
                table.put(arr[i],table.get(arr[i]) + 1);
            }else{
                table.put(arr[i],1);
            }
        }
         
        Set<Integer> keys = table.keySet();
        
        for(int i : keys){
            if(table.get(i) >= k){
               ans = Math.min(ans,i);
            }
        }
        
        if(ans != Integer.MAX_VALUE){
            return ans;
        }else{
            return 0;
        }
    }