美文网首页
二分查找

二分查找

作者: LdpcII | 来源:发表于2018-08-05 17:10 被阅读0次

    题目描述:

    输入一个有序的数组 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
    

    相关文章

      网友评论

          本文标题:二分查找

          本文链接:https://www.haomeiwen.com/subject/jhibvftx.html