百度&必应权4, 日IP8000. 查看详情
自助收录

使用暴力算法解决“在排序数组中查找元素的第一个和最后一个位置”问题

算法刷题2年前 (2023)更新 江南白衣
321 0 0
使用暴力算法解决“在排序数组中查找元素的第一个和最后一个位置”问题

34. 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]

思路:使用两个for循环(注意,不是嵌套循环),分别从数组最左边和最右边遍历,即可得出左右两边边界。

package leetcode.binarysearch;

import java.util.Arrays;

/**
 * 34. 在排序数组中查找元素的第一个和最后一个位置
 * 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
 * 如果数组中不存在目标值 target,返回[-1, -1]。
 * 原文地址:https://www.codernav.com/2874.html
 * 更多算法详解:https://www.codernav.com
 */
public class Q_34 {
    public static void main(String[] args) {
        // 暴力算法
        int[] result = f(new int[]{5, 7, 7, 8, 8, 10}, 8);
        System.out.println(Arrays.toString(result));
    }

    private static int[] f(int[] nums, int target) {
        if (nums.length == 0) {
            return new int[]{-1, -1};
        }
        // 正向遍历,找到最左边位置
        int left = Integer.MIN_VALUE;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target) {
                left = i;
                break;
            } else {
                left = -1;
            }
        }
        // 反向遍历,找到最右边位置
        int right = Integer.MAX_VALUE;
        for (int i = nums.length - 1; i >= 0; i--) {
            if (nums[i] == target) {
                right = i;
                break;
            } else {
                right = -1;
            }
        }

        return new int[]{left, right};
    }
}

 

© 版权声明

相关文章

暂无评论

暂无评论...