Last Position of Target

Find the last position of a target number in a sorted array. Return -1 if target does not exist.

Example
Given [1, 2, 2, 4, 5, 5].

For target = 2, return 2.

For target = 5, return 5.

For target = 6, return -1.

O(logn)

public class LastPositionofTarget {
    /**
     * 解题思路:本题主要是二分法的使用,题目明确要求需要求最后一个与target相等的数,所以设置数值时尽量向后靠,并检查start及end两个数字且必须先检查
     * end位置数字是否符合需求。
     * 解题方法:首先排除为空及长度为0的情况,然后设置start位置为0,end位置为nums.length-1(数组下标从0开始,所以要减去1),
     * 然后开始进行while循环,为了避免死循环,这里条件设置为start+1<end,
     *         1.在循环里首先确定中点进行二分,即int mid = start +(end -start)/2;
     *         2.判断如果nums[mid]==target则说明找到相同的数值,但是题目要求求出最后一个相同的,继续找右区间,所以设置start=mid;
     *         3.判断如果nums[mid]>target则说明中点数字比target要大取左区间,所以设置end=mid;
     *         4.判断如果nums[mid]<target则说明中点数字比target要小取右区间,所以设置start=mid;
     * 循环结束后start和end都会有值,求这两个值是否和target相等,注意需要求最后一个数值所以先求end位置的值,如果相同则return;
     * @param nums
     * @param target
     * @return
     */
    public  int solution(int[] nums, int target) {
        if (nums == null || nums.length == 0 || target == 0) {
            return -1;
        }
        int start = 0;
        int end = nums.length - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if(nums[mid]==target){
                start=mid;
            }else if(nums[mid]>target){
                end = mid;  
            }else {
                start = mid;
            }
        }
        if(nums[end]==target){
            return end;
        }
        if(nums[start]==target){
            return start;
        }
        return -1;
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容