leetcode做题记录0034

leetcode 0034

说明

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

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

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

题目描述

在这里插入图片描述

思路

又是二分法的题。

我是这样做的:

第一个循环:用二分找到任意一个目标数的位置idxTarget。

第二个循环:从0到idxTarget还是用二分找到第一个目标位置,即本身是target且前一个不是target或前一个不存在。

第三个循环思路和第二个循环一样,从idxTarget到nums.length-1找到最后一个目标位置。

时间复杂度大概是O(3logn).

class Solution {
    public int[] searchRange(int[] nums, int target) {
		int[] res = { -1, -1 };
		if (nums.length == 0) {
			return res;
		}
		if (nums.length == 1) {
			if (target == nums[0]) {
				return new int[] { 0, 0 };
			} else {
				return res;
			}
		}
        if (target < nums[0] || target > nums[nums.length - 1]) {
			return res;
		}
		int start = 0, end = nums.length;
		int idxTarget = -1;
		while (start <= end) {
			int mid = (start + end) / 2;
			if (nums[mid] > target) {
				end = mid - 1;
			} else if (nums[mid] < target) {
				start = mid + 1;
			} else {
				idxTarget = mid;
				break;
			}
		}
		if (idxTarget == -1) {
			return res;
		}
		start = 0;
		end = idxTarget;
		while (start <= end) {
			int mid = (start + end) / 2;
			if (nums[mid] != target) {
				start = mid + 1;
			} else if (mid != 0 && nums[mid - 1] == target) {
				end = mid - 1;
			} else {
				res[0] = mid;
				break;
			}
		}
		start = idxTarget;
		end = nums.length;
		while (start <= end) {
			int mid = (start + end) / 2;
			if (nums[mid] != target) {
				end = mid - 1;
			} else if (mid != nums.length - 1 && nums[mid + 1] == target) {
				start = mid + 1;
			} else {
				res[1] = mid;
				break;
			}
		}
		return res;
	}
}
发布了77 篇原创文章 · 获赞 1 · 访问量 2059

猜你喜欢

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