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); } } }
本文来自博客园,作者:chch213,转载请注明原文链接:https://www.cnblogs.com/chch213/p/16630994.html