问题
在重复数字数组中查找非重复数字的列表。
我的解决方案
public static int[] FindNonRepeatedNumber(int[] input)
{
List<int> nonRepeated = new List<int>();
bool repeated = false;
for (int i = 0; i < input.Length; i++)
{
repeated = false;
for (int j = 0; j < input.Length; j++)
{
if ((input[i] == input[j]) && (i != j))
{
//this means the element is repeated.
repeated = true;
break;
}
}
if (!repeated)
{
nonRepeated.Add(input[i]);
}
}
return nonRepeated.ToArray();
}
时间和空间复杂性 时间复杂度= O(n ^ 2) 空间复杂度= O(n)
我不确定上面计算的时间复杂度,我怎样才能使这个程序更有效,更快速。
答案 0 :(得分:2)
您提供的算法的复杂性为O(n^2)
。
使用Hashmaps改进算法。 Psuedo代码如下:
public static int[] FindNonRepeatedNumbers(int[] A)
{
Hashtable<int, int> testMap= new Hashtable<int, int>();
for (Entry<Integer, String> entry : testMap.entrySet()) {
tmp=testMap.get(A[i]);
testMap.put(A[i],tmp+1);
}
/* Elements that are not repeated are:
Set set = teatMap.entrySet();
// Get an iterator
Iterator i = set.iterator();
// Display elements
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
if(me.getValue() >1)
{
System.out.println(me.getValue());
}
}
<强>操作:强> 我在这里做的是我使用带有键的Hashmaps来作为输入数组元素的哈希映射。哈希映射的值类似于每个元素的计数器。因此,如果元素出现一次,则该键的值为1,并且随后基于输入数组中元素的重现递增键值。
所以最后你只需检查你的hashmap,然后显示hashvalue 1的元素,这些元素是非重复元素。如果输入数组长度为O(k)
,则此算法的时间复杂度为O(k)
用于创建hashmap和k
用于搜索。这比O(n^2)
快得多。最糟糕的情况是根本没有重复的元素。伪代码可能很乱,但这种方法是我能想到的最好的方法。
答案 1 :(得分:0)
时间复杂度O(n)意味着你不能有内循环。完整的内部循环是O(n ^ 2)。
答案 2 :(得分:0)
void longestcontinuousunique(int arr[])
{
int start=0;
int end =0;
while (end! =arr.length())
{
if(arr[start] == arr[end])
{
start++;
savetolist(start,end,end-start);
}
else
end++
}
return maxelementof(savedlist);
}