题目: 给定一个整数数组 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 算法合集地址
网友评论