LeetCode刷题23-在排序数组中查找元素的第一个和最后一个位置

import java.util.Arrays;

/**
 * 功能描述
 *
 * @author ASUS
 * @version 1.0
 * @Date 2022/8/27
 */
public class Main06 {
    public static void main(String[] args) {
       /*
        给定一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

        如果数组中不存在目标值 target,返回 [-1, -1]。


        设计并实现时间复杂度为 O(log n) 的算法解决此问题。


        示例 1:

        输入:nums = [5,7,7,8,8,9,8,10], target = 8

        输出:[3,4]
        */

        int[] nums = new int[]{5, 7, 7, 8, 8, 9, 10};
        int target = 7;
        getTarget2(nums, target);
    }

    /**
     * 获取目标值  时间复杂度 O(n)
     *
     * @param nums
     * @param target
     * @return
     */
    private static void getTarget(int[] nums, int target) {
        int start = -1;
        int end = -1;

        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target && start == -1) {
                start = i;
                break;
            }
        }

        for (int i = nums.length - 1; i >= 0; i--) {
            if (nums[i] == target && end == -1) {
                end = i;
                break;
            }
        }
        System.out.println(Arrays.asList((start + "," + end).split(",")));
    }

    /**
     * 获取目标值 时间复杂度O(n)
     *
     * @param nums
     * @param target
     * @return
     */
    private static void getTarget2(int[] nums, int target) {
        int start;
        int end;
        String string = Arrays.toString(nums).replace(",", "").replace(" ", "");
        string = string.substring(1, string.length() - 1);
        System.out.println(string);

        start = string.indexOf(String.valueOf(target));
        end = string.lastIndexOf(String.valueOf(target));

        System.out.println(Arrays.asList((start + "," + end).split(",")));
    }
}

 

简单二分查找

前提:数组递增或者递减且元素不同

package exam;

import java.util.Arrays;

/**
 * 功能描述
 *
 * @author ASUS
 * @version 1.0
 * @Date 2022/8/27
 */
public class Main06 {
    public static void main(String[] args) {
        int[] nums = new int[]{1, 3, 5, 7, 9, 11, 19};
        int target = 5;
        getTarget3(nums, target);
    }


    /**
     * 获取目标值-二分查找法 假设数据元素递增且不相同
     *
     * @param nums
     * @param target
     * @return
     */
    private static void getTarget3(int[] nums, int target) {
        // 左下标
        int left = 0;
        // 右下标
        int right = nums.length;
        // 中间坐标
        int center;
        // 中间坐标数值
        int tempData;
        // 标识是否找到
        boolean bool = false;

        while (left <= right) {
            // 取中间位置数据 做比对
            center = (left + right) / 2;
            tempData = nums[center];

            // 等于目标值 已找到数据
            if (tempData == target) {
                System.out.println("left:" + center);
                bool = true;
                break;
            }

            // 小于目标值 那肯定要去右边去查
            // 需要移动left right不变
            if (tempData < target) {
                left = center + 1;
            }

            // 大于目标值 那肯定要去左边去查
            // 需要移动right left不变
            if (tempData > target) {
                right = right - 1;
            }
        }
        if (!bool) {
            System.out.println("left:" + -1);
        }
    }

}

 

posted @ 2022-08-27 17:31  chch213  阅读(22)  评论(0编辑  收藏  举报