假设我们有一个整数数组numArray [10,23,47,10,19,10]和一个数字(k)10,我们需要找出数组中是否有三个数字(在这种情况下,它确实)。检查这个的最佳方法是什么?我现在想的方法是对数组进行排序,然后查看数组中是否有3个数字彼此相邻。
numArray = sort(numArray) // O(nlogn)
Loop through numArray to check if number ks are adjacent // O(n)
这将使总运行时间为O(nlogn + n)= O(nlogn)。有没有更好的方法在较短的时间内完成这项工作?
更新:如果没有给出数字k,答案会如何变化。只是找出阵列中是否有任何数字出现三次?
答案 0 :(得分:1)
对C ++无能为力,但如果你知道k
并且不知道k
,这里有一个Python解决方案。第一个是O(n)
时间复杂度,O(1)
存储空间使用情况。第二个是O(n)
。
方式1 :只需计算k
的出现次数,然后检查count == 3或n
。
方式2 :为该值的出现创建值的字典/映射。在迭代值时,增加地图中该值的计数。然后循环遍历地图中的值并检查值是3还是n
。
def array_contains_n_k(arr, n, k):
count = 0
for val in arr:
if val == k:
count+=1
return count == n
def array_contains_n_number(nums, n):
counts = dict()
for val in nums:
key = str(val)
if key in counts:
counts[key] += 1
else:
counts[key] = 1
for k,v in counts.items():
if v == n:
return True
nums = [10, 23, 47, 10, 19, 10]
k = 10
n = 3
print array_contains_n_k(nums, n, k) # True
print array_contains_n_number(nums, n) # True
答案 1 :(得分:0)
除非数组很大,否则您只需将数组转换为字符串并计算您要查找的数字的出现次数(请参阅代码段)。我不确定这对大型阵列有什么影响。
function myFunction() {
var numArray = [10,23,47,10,19,10];
var mystring = numArray.toString();
var count = (mystring.match(/10/g) || []).length;
document.getElementById("result").innerHTML = count;
}

<button onclick="myFunction()">count 10's</button>
<p id="result"></p>
&#13;
答案 2 :(得分:0)
import java.util.HashMap;
public class RepeatedNumInArray {
/**
* @param args
*/
public static void main(String[] args) {
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
int arrynum[] = {10,23,47,10,19,10};
for (int i = 0; i < arrynum.length; i++) {
// put all integer values in Map
// make use of Map key-value pair
if(hm.containsKey(arrynum[i])){
hm.put(arrynum[i], hm.get(arrynum[i])+1);
}
//if value occur only one time
else
{
hm.put(arrynum[i], 1);
}
}
for(int i:arrynum)
{
//check if value occurs 3 times
if (hm.get(i) >=3)
{
System.out.println("Repeated num in Array is " +i+ " : "+hm.get(i));
break;
}
}
}
}
OutPut:Array中的重复数为10:3