【刷题第一周】StrStr和二分查找习题汇总

本文深入探讨了算法中的搜索与排序技术,包括经典的二分查找、寻找峰值元素、在旋转排序数组中搜索等。解析了StrStr、子集、排列组合、组合求和等问题的解决策略,同时提供了详细的递归模板和二分查找算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

StrStr Basics

  • 1. StrStr实现
  • 2. Subsets I, II
  • 3. Permutations I, II
  • 4. Combination Sum

递归模板

Binary Search

  • 1. Search in rotated sorted array
  • 1*. Search in Rotated Sorted Array II
  • 2. Find peak element
  • 3. Peak Index in a Mountain Array
  • 4. Smallest Rectangle Enclosing Black Pixels LintCode 600

33. Search in Rotated Sorted Array

有两个基本的情况,就是low-T-mid 和mid-T-high,如果属于这两种基本的情况,则按照基本的二分法缩小rank;如果不是,则无脑把range切换到另一边。
注意,在一个已经旋转过的数组里面,不符合要求的另一边的形态和最开始的形态是一样的(两个上升区间)。

class Solution {
    public int search(int[] nums, int target) {
        if(nums == null || nums.length == 0){
            return -1;
        }
        int left = 0;
        int right = nums.length - 1;
        while (left <= right){
            int mid = (left + right) / 2;
            if(nums[mid] == target){
                return mid;
            }
            if (nums[mid] < nums[right]){
                if(target > nums[mid] && target <= nums[right]){
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            } else {
                if (target >= nums[left] && target < nums[mid]){
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            }
        }
        return -1;
    }
}

LintCode 75. Find Peak Element

因为题目给了第1个元素比第0个元素要大,并且倒数第二个元素也比最后一个元素大,那么这个数组肯定是有一个峰值的。
用二分法的思路:先找中点,看看中点是不是peak。然后看左右两边哪边数字大,数字大的那边肯定是有一个peak的。

public class Solution {
    /**
     * @param A: An integers array.
     * @return: return any of peek positions.
     */
    public int findPeak(int[] A) {
        // write your code here
        if(A==null || A.length == 0){
            return -1;
        }
        int left = 0;
        int right = A.length - 1;
        while(left <= right){
            int mid = (left +right) / 2;
            if (isPeak(mid, A)){
                return mid;
            }
            if (mid + 1 < A.length && A[mid] < A[mid+1]){
                left = mid + 1;
                continue;
            }
            if (mid - 1 >= 0 && A[mid] < A[mid-1]){
                right = mid - 1;
                continue;
            }
        }
        return -1;
    }
    private boolean isPeak (int index, int[] nums){
        if (nums.length == 1){
            return true;
        }
        if (index == 0 || index == nums.length - 1){
            return false;
        }
        if (nums[index] > nums[index-1] && nums[index] > nums[index+1]){
            return true;
        } else {
            return false;
        }
    }
}

153. Find Minimum in Rotated Sorted Array

我的post:LeetCode论坛

81. Search in Rotated Sorted Array II

粪题。。。直接O(n)用for循环。。。本题考点不在二分法,因为“Most implementations of binary search assume that the target array has no duplicates.”

LintCode 600. Smallest Rectangle Enclosing Black Pixels

在一个2D矩阵中会有唯一的由黑色像素点构成的孤岛,会给你一个点的坐标。
思路:根据这个点的坐标展开,分别对左边右边上面下面进行二分查找,找到最大延伸的位置。九章算法。

周末复习情况:

SubsetsII要注意有重复元素的数组的排序问题,因为如果不排序的话完全没法用i > start && nums[i] == nums[i-1]来除重。其他题目一次过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值