二分查找

2018-08-05  本文已影响0人  LdpcII

题目描述:

输入一个有序的数组 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. 将数组分为两部分: (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
  2. 将数组分为两部分: (7), 9, (11)
    对目标数 target 和 数组中间的数 sort_array[mid] 大小进行比较:
    target < sort_array[mid],所以我们取前半段(7);
    begin = 3;end = mid - 1 = 3;mid = (begin + end) / 2
  3. 将数组分为两部分: (), 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
上一篇下一篇

猜你喜欢

热点阅读