• 模板整理


    1.递归

    int name(int n) {
        if(满足边界条件) return ...;
        if(满足边界条件) return ...;
        ...
        else {
            sbproblems...
            ...
            return name(...) + ...
        }
    }

    2.二分

    2.1 左边界

    int left_bound(int[] nums, int target) {
     if (nums.length == 0) return -1;
     int left = 0;
     int right = nums.length; // 注意
    
     while (left < right) { // 注意
         int mid = (left + right) / 2;
         if (nums[mid] == target) {
             right = mid;
         } else if (nums[mid] < target) {
             left = mid + 1;
         } else if (nums[mid] > target) {
             right = mid; // 注意找到 target 时不要立即返回,而是缩小「搜索区间」的上界 right,在区间 [left, mid) 中继续搜索,即不断向左                          // 收缩,达到锁定左侧边界的目的。
         }
     }
     return left;
    }

    2.2右边界

    int right_bound(int[] nums, int target) {
        if (nums.length == 0) return -1;
        int left = 0, right = nums.length;
    
        while (left < right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                left = mid + 1; // 注意
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid;//当 nums[mid] == target 时,不要立即返回,而是增大「搜索区间」的下界 left,使得区间不断向右收缩,达到锁定右侧                          //边界的目的。
            }
        }
        return left - 1; // 注意while 循环的终止条件是 left == right,所以 left 和 right 是一样的,你非要体现右侧的特点,返回 right - 1                       
    }

    3.搜索

    3.1dfs

    Void DFS(deep,...){
      if(找到解 || 走不下去了){
       ......//根据题意添加
        return; 
      }
      for(扩展方式){
       if(扩展方式所能达到的状态合法){
          修改操作;//根据题意添加
          标记;
          DFS(deep+1,...);
          //根据题意是否要还原
        }  
      }
    
    }

    3.2bfs

    void BFS(){
     初始化队列Q;
     起点S入队;
     标记S已经访问;
     while(Q非空){
       取Q的队首元素U;
       U出队列;
       if(u==目标状态){
         返回结果;
        }
       for(所有与U相邻的元素){
         if(相邻的元素合法 && 未访问){
            入队;
            标记访问;
           }
       }
     }
    }
  • 相关阅读:
    Flipboard web移动端-打造每秒60帧的流畅体验
    android开源代码演示项目CodeBox
    Material风格的文件管理器
    android:ToolBar详解
    GossipView:圆圈布局的自定义view
    9个完整android开源app项目
    android-波浪效果ripple-background
    Android Studio 简单介绍和使用问题小结
    ActionItemBadge:在actionbar上显示badge数字提示
    在ContentResolver中使用Group By
  • 原文地址:https://www.cnblogs.com/cqbz-ChenJiage/p/13504678.html
Copyright © 2020-2023  润新知