美文网首页
山脉数组中查找目标值

山脉数组中查找目标值

作者: 7赢月 | 来源:发表于2020-05-05 15:21 被阅读0次

题目描述

https://leetcode-cn.com/problems/find-in-mountain-array/


// 找到峰顶
// 在峰顶左边 递增数组
// 在峰顶右边 递减数组
func findPeakSlope(pStart, pEnd int, pMountainArr *MountainArray) int {
    for pStart < pEnd {
        mid := pStart + (pEnd-pStart)/2
        midNum := pMountainArr.get(mid)
        if pMountainArr.get(mid+1) > midNum {
            pStart = mid + 1
        } else {
            pEnd = mid
        }
    }
    return pStart
}

// 递增排序
func FindPositiveSlope(pStart, pEnd, pTarget int, pMountainArr *MountainArray) int {
    mid := (pStart + pEnd) / 2
    for pStart <= pEnd {
        if pMountainArr.get(mid) == pTarget {
            return mid
        }
        if pMountainArr.get(mid) > pTarget {
            pEnd = mid - 1
        } else {
            pStart = mid + 1
        }
        mid = (pStart + pEnd) / 2
    }
    return -1
}

// 递减排序
func FindBackSlope(pStart, pEnd, pTarget int, pMountainArr *MountainArray) int {
    mid := (pStart + pEnd) / 2
    for pStart <= pEnd {
        if pMountainArr.get(mid) == pTarget {
            return mid
        }
        if pMountainArr.get(mid) > pTarget {
            pStart = mid + 1
        } else {
            pEnd = mid - 1
        }
        mid = (pStart + pEnd) / 2
    }
    return -1
}
func findInMountainArray(target int, mountainArr *MountainArray) int {
    // 错误处理
    if mountainArr.length() == 0 {
        return -1
    }
    // 二分查找
    peakIndex := findPeakSlope(0, mountainArr.length()-1, mountainArr)
    if mountainArr.get(peakIndex) == target {
        return peakIndex
    }
    // 递增
    r := FindPositiveSlope(0, peakIndex-1, target, mountainArr)
    if r != -1 {
        return r
    }
    r = FindBackSlope(peakIndex+1, mountainArr.length()-1, target, mountainArr)
    return r
}

思路

题目的关键点是山脉数组,山脉的特点是:顶峰向左是递增的;顶峰向右是递减的利用这个特性,首先找出顶峰节点,在往两边的递增递减数据使用二分就能轻易的解了,虽然是hard模式,但是申清题目就很简单了!上面写了很多多余的代码,这个大家见笑了!

相关文章

  • LeetCode #1095 Find in Mountain

    1095 Find in Mountain Array 山脉数组中查找目标值 Description:(This ...

  • 山脉数组中查找目标值

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-i...

  • 山脉数组中查找目标值

    题目: 题目的理解: 在左边升序的数组中找target,如果没有找到则从右边的target进行查找。使用二分法查找...

  • 山脉数组中查找目标值

    题目描述 https://leetcode-cn.com/problems/find-in-mountain-ar...

  • 1095. 山脉数组中查找目标值

    这是一个 交互式问题 ) 给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.g...

  • 算法「两数之和」

    题目:给出数组nums和目标值target,找出和为目标值的两个数在数组中 想法:定义数组和目标值,遍历数组x使得...

  • Java基本算法——二分查找算法

    二分查找算法 每次查找取数组中位数的值进行比较,如果目标值值大于中位数的值,则截取中位数右侧的数组再次进行二分查找...

  • 查找算法

    二分查找 1. 递归实现 2. 迭代实现 题目 1. 插入位置 题目 给定一个排序数组与目标值,该数组中没有重复元...

  • 35. Search Insert Position 查找插入位

    题目 给定一个不重复的排序数组 nums 和目标值 target。如果目标值在数组中,返回目标值的位置,否则,返回...

  • Leetcode 35 搜索插入位置

    搜索插入位置 题目 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回...

网友评论

      本文标题:山脉数组中查找目标值

      本文链接:https://www.haomeiwen.com/subject/rbmmghtx.html