题目

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [,,,,,,] 可能变为 [,,,,,,] )。

编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false

示例 1:

输入: nums = [,,,,,,], target =
输出: true

示例 2:

输入: nums = [,,,,,,], target =
输出: false

进阶:

思想

本题是需要使用二分查找,怎么分是关键,举个例子:

  • 第一类

10111 和 11101这种。此种情况下 nums[start] == nums[mid],分不清到底是前面有序还是后面有序,此时 start++ 即可。相当于去掉一个重复的干扰项

  • 第二类

2345671这种,也就是 nums[start] < nums[mid]。此例子中就是 2 < 5;

这种情况下,前半部分有序。因此如果 nums[start] <=target<nums[mid],则在前半部分找,否则去后半部分找

  • 第三类

6712345这种,也就是 nums[start] > nums[mid]。此例子中就是 6 > 2;

这种情况下,后半部分有序。因此如果 nums[mid] <target<=nums[end]。则在后半部分找,否则去前半部分找。

代码

func search(_ nums: [Int], _ target: Int) -> Bool {
if nums.count <= {
return false
}
var start =
var end = nums.count -
var mid: Int =
while start <= end {
mid = start + (end - start)/
if nums[mid] == target {
return true
}
if nums[start] == nums[mid] {
start +=
continue
}
if nums[start] <= nums[mid] {
if nums[mid] > target && nums[start] <= target {
end = mid -
} else {
start = mid +
}
} else {
if nums[mid] < target && nums[end] >= target {
start = mid +
} else {
end = mid -
}
}
}
return false
}

最新文章

  1. 抛弃jQuery:DOM API之操作元素
  2. Vue.js实现checkbox的全选和反选
  3. 在hive中遇到的错误
  4. FORM中需要反复选择LOV
  5. 【wikioi】1116 四色问题
  6. jQuery基本选择器
  7. 离线网页制作器(beta1.0)
  8. python文件操作--字符串替换
  9. eclipse删除已经记录的用户名和密码
  10. HDFS 整体把握
  11. Java学习日记-5 关键字static和final 以及接口
  12. 用C#实现的条形码和二维码编码解码器
  13. HTTP POST和GET的区别[转]
  14. spring在扫描包中的注解类时出现Failed to read candidate component错误
  15. 小程序代码包压缩 策略&amp;方案
  16. sqlmap完成简单的sql注入
  17. python基础四-文件读取
  18. pxe+Kickstart自动装机补充知识点
  19. linux 查看信息-进程&amp;用户&amp;服务&amp;程序
  20. Python-CSS入门

热门文章

  1. 学习Python前言
  2. Oracle:Redhat 7.4+Oracle Rac 11.2.0.4 执行root.sh报错处理
  3. django6-orm进阶操作
  4. gradle 参数配置监听
  5. PHP比较两个数组的差异
  6. java实现序列化的两种方式
  7. JAVA框架中XML文件
  8. 01-路由跳转 安装less this.$router.replace(path) 解决vue/cli3.0语法报错问题
  9. leetcode 贪心算法
  10. 用一个例子说明oracle临时表,创建过程,