LeetCode Contains Duplicate III
2015-06-06 08:46
417 查看
LeetCode Contains Duplicate III
题目
思路
我的方法是先用一个结构体,存下每个数字的值和其原坐标;然后根据值大小排序;
接着遍历每一个数字num[i].val;
利用二分查找找到刚好比num[i].val - t - 1大的数字的坐标;
然后根据坐标判断是否存在值即可;
关于二分查找可见:Binary Search
代码
[code]struct num { int pos, val; }; int AD(struct num * nums, int l, int r) { int K = nums[l].val; int Kp = nums[l].pos; while (l < r) { while (l < r && nums[r].val > K) r--; if (l < r) nums[l++] = nums[r]; while (l < r && nums[l].val < K) l++; if (l < r) nums[r--] = nums[l]; } nums[l].val = K; nums[l].pos = Kp; return l; } void QS(struct num * nums, int l, int r) { if (l < r) { int mid = AD(nums, l, r); QS(nums, l, mid - 1); QS(nums, mid + 1, r); } } // 在不下降的序列中寻找恰好比target大的数出现位置,也即第一个比target大的数出现的位置 int binarySearchIncreaseFirstBigger(struct num * nums, int l, int r, int target) { if (r - l + 1 == 0) return -1; while (l < r) { int m = l + ((r - l) >> 1); if (nums[m].val <= target) l = m + 1; else r = m; } if (nums[r].val > target) return r; else return -1; } bool containsNearbyAlmostDuplicate(int* nums, int numsSize, int k, int t) { struct num * N = (struct num*)malloc(sizeof(struct num) * numsSize); for (int i = 0; i < numsSize; i++) N[i].pos = i, N[i].val = nums[i]; QS(N, 0, numsSize - 1); for (int i = 1; i < numsSize; i++) { int minPos = binarySearchIncreaseFirstBigger(N, 0, i - 1, N[i].val - t - 1); if (minPos == -1) { } else { for (int j = minPos; j < i; j++) { if (abs(N[i].pos - N[j].pos) <= k) { free(N); return true; } } } } free(N); return false; }
相关文章推荐
- Container With Most Water
- POJ 1273 DRAINAGE DITCHES【最大流】
- Contains Duplicate II
- windows内核情景分析之—— KeRaiseIrql函数与KeLowerIrql()函数
- 严重: StandardServer.await: create[8005]:
- WorldWind源码剖析系列:地形访问器类TerrainAccessor
- WorldWind源码剖析系列:地形瓦片类TerrainTile和地形瓦片服务类TerrainTileService
- RAID
- pthread_cond_wait
- 端口状态说明 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT
- Opencv研习笔记:haartraining程序之cvCreateCARTClassifier函数详解(CART树状弱分类器创建)
- NSSearchPathForDirectoriesInDomains用法(转)
- OnPaint()中图片绘制位置的选择
- VC编译错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义
- X-Cache and X-Cache-Lookup headers explained
- aix学习笔记
- 在Flex中用Validator检测数字、字符串、Email、电话号码等 .
- MongoDB assertion: 18 { code: 18, ok: 0.0, errmsg: "auth fails" }
- MongoDB assertion: 18 { code: 18, ok: 0.0, errmsg: "auth fails" }
- 关于 wait_event_interruptible() 和 wake_up()的使用