力扣 二分查找变形

先找个例子写出来然后再找规律写代码,然后去找测试用例运行,通过例子去找自己逻辑没有考虑全面的地方,但在企业的项目需求中,可能并没有好的示例,所以要自己想好if的条件判断,一定要先理清需求,然后再想好逻辑,最后写代码、、、



class Solution {
    public int findMin(int[] nums) {
        int length = nums.length;
        if(length==1) return nums[0];
        // if(length==2) return nums[0]>nums[1]?nums[1]:nums[0];
        int i=0,j=length-1,min=nums[0];
        while (i<=j){
            int mid=(i+j)/2;
            if(nums[mid]<min) min=nums[mid];
            //左边有序
            if(nums[mid]>nums[i]){
                if(nums[j]<nums[i]){
                    i=mid+1;
                }else {
                    j=mid-1;
                }
            }else {
                if(mid==i) return nums[mid]>nums[j]?nums[j]:nums[mid];
                if(mid-1>=0 && nums[mid]<nums[mid-1]) return nums[mid];
                else {
                    j=mid-1;
                }
            }
        }
        return min;
    }
}

或者

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

作者:armeria
链接:https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/solutions/126635/er-fen-cha-zhao-wei-shi-yao-zuo-you-bu-dui-cheng-z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

完蛋,我感觉我的代码能力退化了

class Solution {
    public int findMin(int[] nums) {
        int i = 0, j = nums.length - 1;
        while (i < j) {
            int m = (i + j) / 2;
            if (nums[m] > nums[j]) i = m + 1;
            else if (nums[m] < nums[j]) j = m;
            else j--;
        }
        return nums[i];
    }
}

如果是这种需要情况分层列举的时候,如果第二层的代码规律非常的难找或者不好写代码,那么就很可能是第一层的规律找错了,或者是写第一层的时候没有去考虑第二层、、、
第一层先分左边是否有序,然后第二层再去研究大小问题,这样就很好写
革命尚未成功,同志仍需努力呀!

class Solution {
    public boolean search(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return false;
        }
        int start = 0;
        int end = nums.length - 1;
        int mid;
        while (start <= end) {
            mid = start + (end - start) / 2;
            if (nums[mid] == target) {
                return true;
            }
            if (nums[start] == nums[mid]) {
                start++;
                continue;
            }
            //前半部分有序
            if (nums[start] < nums[mid]) {
                //target在前半部分
                if (nums[mid] > target && nums[start] <= target) {
                    end = mid - 1;
                } else {  //否则,去后半部分找
                    start = mid + 1;
                }
            } else {
                //后半部分有序
                //target在后半部分
                if (nums[mid] < target && nums[end] >= target) {
                    start = mid + 1;
                } else {  //否则,去后半部分找
                    end = mid - 1;

                }
            }
        }
        //一直没找到,返回false
        return false;

    }
}

当三道一起写完的时候,再一起看,为什么最后一道题是分层写的?因为比较的数更多,i,j,mid,target
所以要分层写

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容