有幸参加了今日头条的笔试题目。这是我参加过的最难的一次笔试题目了。
第一题
题目描述
- 在n个元素的数组中,找到差值为k的数字对去重后的个数。
输入描述
- 第一行:n和k,n表示数字的个数,k表示差值。
- 第二行:n个正整数。
输出描述
想到的解法
step 1. 排序
step 2. 遍历一遍排序后的数组. 对遍历的当前值a[i], 二分查找数组中是否存在值a[i] + k.
备注: 当时我没有用这种想法,而用了一种比这个麻烦的想法,导致accept rate只有30%. 但个人感觉这种算法也达不到AC的要求, 复杂度为$O(nlogn)$. 或许有更简单的算法, 复杂度为$O(n)$.
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <iostream> #include <vector> #include <algorithm> using namespace std;
bool binary_find(vector<int> * arr, int front, int behind, int target) { while(front <= behind) { int mid = (front + behind) / 2; if((*arr)[mid] < target) { front = mid + 1; } if((*arr)[mid] > target) { behind = mid - 1; } if((*arr)[mid] == target) return true; } return false; }
int main() { int n; int k; vector<int> array; cin >> n >> k;
if(n == 0) { cout << 0; return 1; }
for(int i =0; i < n; i++) { int temp = 0; cin >> temp; array.push_back(temp); }
sort(array.begin(), array.end());
int now_value = array[0]; int couple_num = 0; if(binary_find(&array, 1, n - 1, array[0] + k)) couple_num += 1; for(int i =1; i < n; i++) { if(array[i] == now_value) { continue; } else { now_value = array[i]; if(binary_find(&array, i + 1, n - 1, array[i] + k)) { couple_num += 1; } } }
cout << couple_num;
return 0; }
|