二分法

二分法,再业务上运行的要比较多。

相比较于通常的暴力循环破解,时间复杂度要从 O(n)  ->  O(logN)

算法题的解题步骤,我还是习惯于先数学思维,再代码思维。

示例:

leetCode, problem 35

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

输入: nums = [1,3,5,6], target = 5
输出: 2

输入: nums = [1,3,5,6,9,10,20,30,40], target = 2
输出: 1

数学分析:

1.单次循环,时间复杂度为O(n),不符合要求

2.二分查找,符合要求。

第一次二分 -> 直接成功,排除1/2错误选项

第二次二分 -> 直接成功,排除1/4错误选项

如果总数为N,最坏的情况下执行 log(N)次,二分可以得出正确选项。

如果没有计算机,用方程式的话:

如果总数为N,插入的数字为P, F(x) 代表x位置是否应该为P

F(x-1) < = P;

F(x+1) >= P;

0<x<N;

根据上述条件求 x 的值,数学没法进行不定义参数迭代,只能给定固定参数值,可以利用二分,不断枚举得出最优解。

 

代码分析:

1.一定要有一个不断循环

2.实现一个函数,来确定F(x),是否满足插入位置

        int n = nums.length;
        int left = 0, right = n - 1, ans = n;
        while (left <= right) {
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) {
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return ans;

  

 

posted @ 2022-01-26 10:12  哦咯哦咯  阅读(137)  评论(0)    收藏  举报