leetcode做题记录0033

leetcode 0033

说明

只是为了记录一下,不求多快,也不深究。

会简要描述思路,代码中不写注释。

如碰到不会做的用了别人代码会在博客中标出。

题目描述

在这里插入图片描述

思路

题目要求时间复杂度是O(logn),就显然是用二分来做。

分两种情况讨论:第一段有序数个数多(大数多)和第二段有序数个数多(小数多);

  1. 大数多

    • 若target小于nums[start],则target肯定在后半段,start := mid;
    • 若target大于nums[start],则比较target和nums[mid],大于nums[mid],在后半段,start := mid;小于nums[mid],在前半段,end := mid;
    • 若target等于nums[start],返回start;
  2. 小数多

    • 若target大于nums[start],则target肯定在前半段,end := mid;

    • 若target小于nums[start],则比较target和nums[mid],大于nums[mid],在后半段,start := mid;小于nums[mid],在前半段,end := mid;

    • 若target等于nums[start],返回start;

class Solution {
    public int search(int[] nums, int target) {
		if (nums.length == 0) {
			return -1;
		}
		if (nums.length == 1) {
			return nums[0] == target ? 0 : -1;
		}
		int start = 0, end = nums.length - 1;
		while (start < end) {
			int mid = (start + end) / 2;
			boolean isBigMore = nums[mid] > nums[start] ? true : false;
			if (isBigMore) {
				if (target < nums[start]) {
					start = mid;
				} else if (target > nums[start]) {
					if (target > nums[mid]) {
						start = mid;
					} else if (target < nums[mid]) {
						end = mid;
					} else {
						return mid;
					}
				} else {
					return start;
				}
			} else {
				if (target > nums[start]) {
					end = mid;
				} else if (target < nums[start]) {
					if (target > nums[mid]) {
						start = mid;
					} else if (target < nums[mid]) {
						end = mid;
					} else {
						return mid;
					}
				} else {
					return start;
				}
			}
		}
		return target == nums[start + 1] ? start + 1 : -1;
	}
}
发布了77 篇原创文章 · 获赞 1 · 访问量 2060

猜你喜欢

转载自blog.csdn.net/Paul_1i/article/details/105026606