好的,我接到了一项任务,我在编写这个问题时遇到了很多问题。
# include <string>
using namespace std;
int listdistinct( string b[], int n );
// modifies b so that all the distinct values are in b[0..k-1] and returns k
// the distinct values are in the order of their leftmost appearance in original b
// e.g. 3,6,3,19,6,3,11 with n=7 would be changed to 3,6,19,11,?,? with k=4 returned
// worstcase complexity is n log(n) or better.
我被认为是首发:
int listdistinct(string b[], int n) {
string a[];
sort b[];
i=1;
for i=0 , i<k {
if b[i] == b[i-1] ;
else { a[n] = b[i-1]; n++;}
}
return n;
}
好的,所以没有给出我问题的最佳描述。 这就是我认为我应该编码的方式。
b [] =数字数组, a [] =没有重复的数字的目的地,最后,c []将是一个数组,它在排序之前采用数组的顺序。
我需要做的是,匹配b []的长度并添加数字,例如1 2 3 4 ...等等到c []以维持我的订单。然后我可以对这两个数组进行排序,因此订单号与b []中的数组编号保持一致。
我有一个问题,知道如何设置for循环来执行此操作,重复多少次!
我也不知道如何订购数组,以便最频繁的数组来到数组的前面。
我遇到的最大问题是了解如何完成所有这些工作,并将算法保持在最差的情况下。
答案 0 :(得分:1)
我认为你应该首先关注你的最后一个问题(how to do all of this, and keep the algorithm to an n log n worst case complexity ?
),其余的应该关注。
在此您知道您需要至少解析一次所有输入数组:这是您复杂性的n
。
现在您可能需要保留另一个包含不同值的数组(在最坏的情况下,它将与输入数组的大小相同)。 log n
表示您无法承受在此阵列上第二次循环,而是您可能希望针对此阵列查看一些二进制搜索解决方案(log n
复杂度)。
因此,输入上的循环和第二个数组上的二进制搜索会为您提供n log n
,现在您只需将其转换为正确的c ++,而Bob就是您的叔叔。