题目描述:
输入一个有序的数组 sort_array 和一个无序的数组 random_array ,对于无序数组 random_array 中的每个元素,判断它们是否在有序数组 sort_array 中,存在标记 1 ,不存在标记 0;
输入:sort_array = [1,3,5,7,9,11];random_array = [1,2,3,4,5,6,7];
输出:resuklt = [1,0,1,0,1,0,0];
题解:
考虑是判断目标元素是否存在于有序数组中,我们采用二分查找的方法进行判断;
对于数组 [1,3,5,7,9,11] 和目标数 target = 8 :
begin = 0;end = 5;mid = (begin + end) / 2
- 将数组分为两部分: (1, 3), 5, (7, 9, 11)
对目标数 target 和 数组中间的数 sort_array[mid] 大小进行比较:
对于 target = 8,sort_array[mid] = 5;target > sort_array[mid],所以我们取后半段(7,9,11);
begin = mid + 1 = 3;end = 5;mid = (begin + end) / 2 - 将数组分为两部分: (7), 9, (11)
对目标数 target 和 数组中间的数 sort_array[mid] 大小进行比较:
target < sort_array[mid],所以我们取前半段(7);
begin = 3;end = mid - 1 = 3;mid = (begin + end) / 2 - 将数组分为两部分: (), 7, ()
对目标数 target 和 数组中间的数 sort_array[mid] 大小进行比较:
target > sort_array[mid],所以我们取后半段();
begin = 3;end = mid - 1 = 2;,此时,end < begin,说明该段不存在;所以数组中不存在目标数 8。
My Solution(C/C++)
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> judge(vector<int> &sort_array, vector<int> &random_array) {
int begin = 0;
int end = sort_array.size() - 1;
int target;
vector<int> result;
for (int i = 0; i < random_array.size(); i++) {
target = random_array[i];
result.push_back(binary_search(begin, end, sort_array, target));
}
return result;
}
private:
bool binary_search(int begin, int end, vector<int> &sort_array, int target) {
if (begin > end) {
return false;
}
int mid = (begin + end) / 2;
if (target == sort_array[mid]) {
return true;
}
else if (target < sort_array[mid]) {
end = mid - 1;
return binary_search(begin, end, sort_array, target);
}
else if (target > sort_array[mid]) {
begin = mid + 1;
return binary_search(begin, end, sort_array, target);
}
}
};
int main() {
vector<int> sort_array;
vector<int> random_array;
sort_array.push_back(-1);
sort_array.push_back(2);
sort_array.push_back(5);
sort_array.push_back(20);
sort_array.push_back(90);
sort_array.push_back(100);
sort_array.push_back(207);
sort_array.push_back(800);
random_array.push_back(50);
random_array.push_back(90);
random_array.push_back(3);
random_array.push_back(-1);
random_array.push_back(207);
random_array.push_back(80);
Solution s;
vector<int> result;
result = s.judge(sort_array, random_array);
for (int i = 0; i < result.size(); i++) {
printf("%d ", result[i]);
}
return 0;
}
结果
1 0 1 0 1 0 1
网友评论