zoukankan      html  css  js  c++  java
  • 二分

    只要证明具有二段性,二分法就有用武之地。

    基本的两个思路

    1. 在循环体里找元素:
      好理解 但是不好用 因为分成了三部分,不适合高级情况
    2. 在循环体里排除一定不存在的区间(先排除):
      好用 分成了两部分并且是没有交集的 要考虑的更少
      l = r 的时候就退出,此时只剩下一个元素,直接在外面判断
      剩两个元素的时候,要向上取整,不然就死循环了
    public class Solution {
      public int search(int[] nums, int target) {
          int len = nums.length;
          int left = 0;
          int right = len - 1;
          while (left < right) {
              int mid = left + (right - left) / 2;
              //这里就属于先排除 不包括等号
              if (nums[mid] < target) {
                  left = mid + 1;
              } else {
                  right = mid;
              }
          }
          if (nums[left] == target) {
              return left;
          }
          return -1;
      }
    }
    

    为什么需要向上取整?

    主要是因为l = m,对于l和r相连的情况,这就是没变化(r = m就不会有这个问题)
    只需要(right - left + 1) / 2就好了

    最左和最右

    旋转

    最小: 比最后一个。找规律的时候不要懵逼了,就找m和最小值的关系,来取舍左还是右
    重最小:逻辑类似,需要考虑等于,r-=1
    搜索:用og,找到了就返回。比较的时候有三种情况,肯定要从最小的开始,不然乱套
    重搜索:本质在于二段性,先恢复二段性。代码和上面一样。

    山峰

    二分答案-另一个次元

    刷题

    • 121 不会很难
  • 相关阅读:
    正则化--L1正则化(稀疏性正则化)
    机器学习分类算法之随机森林
    机器学习分类算法之逻辑回归
    机器学习分类算法之朴素贝叶斯
    机器学习分类算法之K近邻(K-Nearest Neighbor)
    机器学习之特征工程
    uwsgi支持http长链接
    机器学习之数据预处理
    机器学习之场景解析
    机器学习之基本概念
  • 原文地址:https://www.cnblogs.com/purexww/p/15319637.html
Copyright © 2011-2022 走看看