问题描述
为您提供了一个整数数组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;
}
}