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(相邻的元素合法 && 未访问){
        入队;
        标记访问;
       }
   }
 }
}