O(n)是最好的你會得到簡單的性質,你必須檢查每一個元素。
我已經在C++ 14標準代碼中實現了Yves Daoust的算法(有一些小的優化)以及您自己的算法。
這裏是你的:
int main(int argc, char* argv[]) {
if(argc == 1) return 0;
//Copy command args to vector of strings.
std::size_t number_count = argc - 1;
std::vector<std::string> cmd_args(number_count);
std::copy(argv + 1, argv + argc, cmd_args.begin());
//Copy convert vector of strings to vector of ints.
std::vector<int> values(number_count);
auto v_begin = values.begin();
for(auto s : cmd_args) {
(*v_begin) = std::stoi(s);
++v_begin;
}
//Sort values in ascending order.
std::sort(values.begin(), values.end());
//Get smallest two values.
std::pair<int, int> two_smallest_values(*values.cbegin(), *(values.cbegin() + 1));
//Calculate differences between each successive number
std::vector<int> differences(values.size() - 1);
for(std::size_t i = 0; i < values.size() - 1; ++i) {
differences[i] = std::abs(values[i] - values[i + 1]);
}
//All values in differences must be the same.
if(std::all_of(differences.cbegin(), differences.cend(), [=](int i) { return i == *differences.cbegin(); })) {
std::cout << "YES\n";
} else {
std::cout << "NO\n";
}
return 0;
}
這裏是伊夫·達斯特的算法:
int main(int argc, char* argv[]) {
if(argc == 1) return 0;
//Copy command args to vector of strings.
std::size_t number_count = argc - 1;
std::vector<std::string> cmd_args(number_count);
std::copy(argv + 1, argv + argc, cmd_args.begin());
//Copy convert vector of strings to vector of ints.
auto v_begin = values.begin();
for(auto s : cmd_args) {
(*v_begin) = std::stoi(s);
++v_begin;
}
//Sort values in ascending order.
std::sort(values.begin(), values.end());
//Get smallest two values.
std::pair<int, int> two_smallest_values(*values.cbegin(), *(values.cbegin() + 1));
std::vector<bool> bits(values.size());
bool result = true;
int smallest_diff = (two_smallest_values.second - two_smallest_values.first);
for(auto v : values) {
int numerator = v - two_smallest_values.first;
int denominator = smallest_diff;
if(numerator % denominator != 0) {
result = false;
break;
}
std::size_t i = numerator/denominator;
if(i < 0 || i >= values.size()) {
result = false;
break;
}
bits[i] = true;
}
if(result == false) {
std::cout << "NO\n";
return 0;
}
//Convert vector of bools (bit-packed) to an unsigned int.
unsigned long long bits_value = 0;
unsigned long long i = 0;
for(auto b : bits) {
bits_value |= (b << i++);
}
//Optimization: Single calculation to determine if all bits are set:
if(std::abs(bits_value - (std::pow(2.0, bits.size()) - 1) < 0.01)) {
std::cout << "YES\n";
} else {
std::cout << "NO\n";
}
return 0;
}
你必須檢查每一個數字,所以複雜度爲'O(N)'。 – Jarod42
是剛排序或唯一的數字。如果他們也是唯一的,你知道有多少人可以在O(1) –
@ManosNikolaidis:只在一個特殊情況下。 –