九章算法第二天,二分搜索

二分搜索分两类,一类可以直接看出来是二分搜索

另一类很难直接看出来是二分搜索,

最重要的是理解二分搜索的思想,

根据有序集合这个特性,每次通过O(1)的时间复杂度 ,使得搜索的规模减半,

同红黑树查找类似(红黑树也是在增加了空间复杂度的情况下,减少了时间复杂度,每次比较,然后就会使得搜索规模减半)

九章讲的二分模板,我觉得比较好,这样在写代码的时候 不会犯错 造成死循环 ,而且可以处理两个整数相加溢出的问题

------------

public class Solution {
    /**
     * @param nums: An integer array sorted in ascending order
     * @param target: An integer
     * @return an integer
     */
    public int lastPosition(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }

        int start = 0, end = nums.length - 1;
        while (start + 1 < end) {//start + 1 < end
            int mid = start + (end - start) / 2;//处理了整数溢出
            if (nums[mid] == target) {
                start = mid;
            } else if (nums[mid] < target) {
                start = mid;
                // or start = mid + 1
            } else {
                end = mid;
                // or start = mid - 1
            }
        }

        if (nums[end] == target) {
            return end;
        }
        if (nums[start] == target) {
            return start;
        }
        return -1;
    }
}

首先解释下为什么是 start+1 < end,其实我们做二分搜索的时候,每次解空间的计算规模都会减半,

最终结束的条件 我们可以认为是 start 与 end相邻就可以不再计算了(因为要么就是start 要么就是end,这样一来不会出错,二来也比较好理解),这样最后 我们判断的时候 end start都判断一次是否 我们想要的解即可

这样就不会遗漏情况

下面的代码是我第一次自己想出来的解法,求解的方式是   先二分找一次,找完之后  接着递归 再在当前解的右边 再次二分搜一次,如果搜不到 那么之前的解 便是最后的目标值

比较蠢,但还是通过了,上完课之后 对二分理解更加深刻了,就不会用这种思路了

    public int lastPosition(int[] nums, int target) {
        if (nums.length == 0) {
            return -1;
        }

        int position = Arrays.binarySearch(nums,target);
        if (position < 0){
            return -1;
        }
        int lastPosition = position;
        do{
            position = Arrays.binarySearch(nums,position+1,nums.length,target);
            if (position >= 0){
                lastPosition = position;
            }
        }while (position >=0);

        return lastPosition;
    }

现在讲一个寻找旋转数组的最小值

题意大概是类似这样的有序数组 [0,1,2,4,6,7] 旋转成[4,6,7,0,1,2] 然后让你找到最小值  假设没有重复值

这题其实比较trick ,如果注意的话 就发现了一个规律 如下图

就是 0-2这个有序集合,它是不会大于4-7的集合

而我们的最小值 就在第二条直线的起始处

这样我们就可以假设mid的两种情况,

如果mid落在左边的集合,很显然,左边这个集合的所有值 都是 大于 整个大的集合的最后一个元素 2

这个时候 我们让start = mid 等于就把问题的规模减半了(例如图二)

图1

图2

------------------------------------------------

寻找峰值的思想是类似的,类似股票的K线,左边是上升,右边是下降,  找到中间的任意一个峰值点即可

因为是找到任意一个峰值点,所以这里最主要的是 要分析 如何二分,

时间: 2024-10-19 09:02:01

九章算法第二天,二分搜索的相关文章

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

九章算法

九章算法 前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode上面Binary Tree的题刷了4遍,目前95%以上能够Bug Free)所以还能跟得上,今天听了一下,觉得学习到最多的,就是把Traverse和Divide Conquer分开来讨论,觉得开启了一片新的天地!今天写这个博客我就尽量把两种方式都写一写吧. Outline: 二叉树的遍历

九章算法--分配抄书员

思路: (1)最常见的思路就是dp:状态表示为dp[i][j],表示前j个人抄i本书最少时间:dp[i][j] = min(max(dp[k][j-1],sum(k+1,i))) (j<=k<i): 解释一下min,max操作,由于抄书是并行,所以就是取所有人时间里的最大值 (2)二分+贪心:我自己一开始的思路是总和除以人数,然后贪心,但是这样可能不是最优解.但是我们可以计算每个人最大和最小抄书的时间,然后二分搜索这个时间即可. 下面代码是DP:但是没有考虑边界情况只是写来熟悉算法流程. 1

分治习题--九章算法培训课第三章笔记

1.Maximum Depth of Binary Tree 这是道简单的分治习题了 分: 左子树最大深度 右子树最大深度 治: 最大深度等于max(左子树,右子树)+1 public class Solution { public int maxDepth(TreeNode root) { if (root == null) { return 0; } int left = maxDepth(root.left); int right = maxDepth(root.right); retur

【九章算法免费公开课】从 strStr 谈面试技巧与 Coding Style

刷题到底刷到什么程度才够? 题目不会直接说不会么? 为什么题目都做出来还是老是挂? 觉得面试官总在为难你? 从来就搞不懂动态规划是什么? 如何正确的骑驴找马? 什么是正确的Coding Style? 面试中该与面试官如何沟通? 本周日,九章算法<算法班>金牌讲师-段誉 为您倾情奉献,同时提供实时在线问答环节,解答您最想知道的面试"内幕"! 讲座时间: 北京时间6月14日 09:30-11:30 (周日) 美西时间6月13日 18:30-20:30(周六) 报名链接: htt

九章算法 课程 视频 录制 免费下载 cs3k.com

cs3k.com [ 九章算法强化班 ] 课程 完整 视频 录制 免费下载 最新一期 << 九章算法强化班 >> 课程完整视频录制, 课件打包下载, 百度云盘 地址 ! 本站长期提供九章算法免费课程视频 与 课件打包下载 Big Table 教学TodoList 探讨System Design 分析Rate Limiter 视频Binary Tree 研究Dribbble 设计Big Data 研究PageRank 面试Google Suggestion 设计Location Ba

CS3K.com 九章算法 课程 视频 录制 免费下载

[ 九章算法班 ] 课程 完整 视频 录制 免费下载最新一期 << 九章算法班 >> 课程完整视频录制, 课件打包下载, 百度云盘 地址 ! 本站长期提供九章算法免费课程视频 与 课件打包下载 Dribbble 视频System Design 探讨Distributed File System 研究MiniLinkedin 探讨Map Reduce 分析Array 视频Design Tiny Url 教学Android 设计Divide Conquer 研究PageRank 视频

九章算法真的能帮助我找到好工作吗? - 程序员- 知乎

我有朋友上了,FLG拿到两个 offer,最终package数字很好.他刷了大概至少3个月题,leetcode啥的+九章,实际上他一年前就在刷题了,拿msft内部练手.当然也没啥不对,钱多即正义.刷题有刷题的意义,确实能锻炼思维,也确实比配置db/nosql/啥的更有意思一些.此外,我这朋友本身也是微软seattle的senior sde (请不要问为毛他有那么多时间刷题...,也不要介意为啥微软的senior sde还需要这么疯狂刷题还去上算法班----唉,所以别人能放下身段参加算法班后拿几个

九章算法系列(#2 Binary Search)-课堂笔记

前言 先说一些题外的东西吧.受到春跃大神的影响和启发,推荐了这个算法公开课给我,晚上睡觉前点开一看发现课还有两天要开始,本着要好好系统地学习一下算法,于是就爬起来拉上两个小伙伴组团报名了.今天听了第一节课,说真的很实用,特别是对于我这种算法不扎实,并且又想找工作,提高自己的情况. 那就不多说废话了,以后每周都写个总结吧,就趁着这一个月好好把算法提高一下.具体就从:课堂笔记.leetcode和lintcode相关习题.hdu和poj相关习题三个方面来写吧.希望自己能够坚持下来,给大家分享一些好的东