July面试题整理系列(1)
2014-07-10 23:00
423 查看
题目描述:
给定一个整数数组,要求找到最小的差的绝对值。
思路:
(1)暴力,O(n^2)
(2)O(n*logn),排序+寻找相邻最小的差值的绝对值,实现在下面的fun_1
(3)O(n*logn),分治,最小差值要么在左边要么在右边,或者一个在左边一个在右边,那么第三种情况就分别遍历左右,找到两边最大值和最小值,
最小值之差的绝对值和最大值之差的绝对值中的较小的就是第三种情况的解(未验证)
(4)先哈希映射,然后遍历映射数组,fun_2
给定一个整数数组,要求找到最小的差的绝对值。
思路:
(1)暴力,O(n^2)
(2)O(n*logn),排序+寻找相邻最小的差值的绝对值,实现在下面的fun_1
(3)O(n*logn),分治,最小差值要么在左边要么在右边,或者一个在左边一个在右边,那么第三种情况就分别遍历左右,找到两边最大值和最小值,
最小值之差的绝对值和最大值之差的绝对值中的较小的就是第三种情况的解(未验证)
(4)先哈希映射,然后遍历映射数组,fun_2
#include <iostream> #include <queue> #include <climits> #include <algorithm> #include <memory.h> #include <stdio.h> #include <map> using namespace std; vector<int> A; //排序+选择最小相邻元素值 int fun_1() { sort(A.begin().A.end()); int i; int ans = INT_MAX; for(i = 0 ; i < A.size()-1 ; ++i) { int tmp = abs(A[i]-A[i+1]); ans = min(ans,tmp); } return ans; } //哈希的思想,类似于基数排序 int fun_2() { int minNum = INT_MAX; int maxNum = INT_MIN; int i; for(i = 0 ; i < A.size() ; ++i) { minNum = min(minNum,A[i]); maxNum = max(maxNum,A[i]); } vector<int> calNum(maxNum-minNum+1); for(i = 0 ; i < A.size() ; ++i) { calNum[A[i]-minNum]++; } int ans = INT_MAX; bool flag = true; int pre; for(i = 0 ; i < calNum.size(); ++i) { if(calNum[i] >= 2) return 0 ; else if(calNum[i] == 1 && flag) { pre = i; flag = false } else if(calNum[i] == 1 && !flag) { ans = min(ans,i-pre); pre = i; } } return ans; } int main() { return 0; }
相关文章推荐
- July面试题整理系列(2)
- [分类整理III]微软等100题系列V0.1版之三:栈、堆、队列面试题集锦
- [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
- 微软等100题系列V1.0版整理I:c/c++基础面试题集锦
- Android面试题详细整理系列(一)
- [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
- July面试整理系列--(5)
- Android面试题详细整理系列(二)
- [分类整理III]微软等100题系列V0.1版之三:栈、堆、队列面试题集锦
- [分类整理IV]微软等100题系列V0.1版:字符串+数组面试题集锦
- [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
- [分类整理III]微软等100题系列V0.1版之三:栈、堆、队列面试题集锦
- [分类整理II]微软等100题系列V0.1版:链表面试题集锦
- [分类整理I]微软等100题系列V0.1版:c/c++基础面试题集锦
- Android面试题详细整理系列(三)
- 我思故我在系列—数据结构面试题NO.19(题目搜集整理者JULY!!)
- 我思故我在系列—数据结构面试题NO.17(题目搜集整理者JULY,非常感谢!!)
- [分类整理II]微软等100题系列V0.1版:链表面试题集锦
- [分类整理III]微软等100题系列V0.1版之三:栈、堆、队列面试题集锦
- 学习研究v_JULY_v整理的微软数据结构和算法面试题