IOS 算法(基础篇) ----- 有效的山脉数组

2020-11-04  本文已影响0人  ShawnAlex

题目: 给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。

山脉数组:

A.length >= 3
在 0 < i < A.length - 1 条件下,存在 I 使得:
A[0] < A[1] < ... A[i-1] < A[I]
A[i] > A[i+1] > ... > A[A.length - 1]

示意图

例子:

输入:[2,1]
输出:false

输入:[1,2,3,4,5,6,7] 或 [7,6,5,4,3,2,1]
输出:false

输入:[0,3,2,1]
输出:true

解题思路

1.遍历法

1.循环上山先走到山顶
2.接下来循环下山走到山下

注意点
① 首尾项不能是山顶
② 相等直接跳出循环
③ 必须有"上山", "下山"过程

    func validMountainArray(_ A: [Int]) -> Bool {

        if A.count < 3 {
            return false
        }
        
        var max = -1, maxif = false, minif = false
        for i in 0..<A.count {
           
            if maxif == false {
                if A[i] == max {
                    return false;
                }else if A[i] > max && i == 1{
                    minif = true
                }else if A[i] < max {
                    maxif = true
                }
                max = A[i]
            }else {
                if A[i] < max {
                    max = A[i]
                }else {
                    return false
                }
            }
        }
        
        if maxif == false || minif == false {
            return false
        }
        
        return true
    }

2.双指针

1.针对下标, 循环判断 先上山下标递增, 数值变小结束
2.循环判断 从另一面上山下标递减, 数值变小结束
3.判断上顶是否相等

注意点
① 首尾项不能是山顶
② 下标留意不能多减

    func validMountainArray(_ A: [Int]) -> Bool {

        if A.count < 3 {
            return false
         }
        var startIndex: Int = 0
        var endIndex: Int = A.count - 1
        while startIndex < endIndex && A[startIndex] < A[startIndex+1] {
            startIndex += 1
        }
        while startIndex < endIndex && A[endIndex] < A[endIndex-1]  {
            endIndex -= 1
        }
        if startIndex == 0 || endIndex == A.count-1{
            return false
        }
        return startIndex == endIndex

    }

题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址

上一篇下一篇

猜你喜欢

热点阅读