搜索旋转排序数组Ⅱ(C, Python)

  • 1. 题目描述
  • 2. 题目分析
  • 3. C语言实现
    • 3.1 遍历法
    • 3.2 二分法
  • 4. Python语言实现

1. 题目描述

难度:中等

2. 题目分析

这道题目是LeetCode–33. 搜索旋转排序数组的延伸题,有三点不一样:

  • 有重复的元素
    数组中的元素虽然是升序的,但是里面含有重复的元素,这相对于33题难度提升了
  • 输出的变量为布尔型变量
    只要求判断数组中是否有元素即可,这相对于33题的输出下标简单一些
  • 不再要求算法复杂度
    不再要求算法复杂度为O(logn),难度直线降低

根据以上分析,可行的算法有两种:

  • 遍历法
    最直接最容易想到的方法就是暴力遍历法,时间复杂度为O(n)。
  • 二分法
    二分法在这道题上相对比较麻烦,我们需要处于数组首尾两个元素出现重复的情况。可以一直判断首尾两个元素是否相等,如果相等,就将末尾元素舍弃掉知道两个元素不等即可。该方法的时间复杂最好的情况是O(logn),最坏的情况是O(n)

3. C语言实现

3.1 遍历法

代码如下:

bool search(int* nums, int numsSize, int target){int i;for(i = 0; i < numsSize; i++){if(target == nums[i])return 1;}return 0;
}

运行结果为:

3.2 二分法

代码如下:

bool search(int* nums, int numsSize, int target){int left, right, mid;left = 0;right = numsSize - 1;// 如果数组长度为1,直接判断if(numsSize == 1) return target==nums[0]?1:0;// 如果数组为空,返回0if(numsSize == 0) return 0;while(left <= right){// 这句话就是防止所有元素都一样的情况if(target == nums[left]) return 1;// 去掉数组尾部有重复的元素while(nums[left] == nums[right] && left < right){right--;}if(target == nums[right]) return 1;mid = (left+right)/2;if (target == nums[mid]) return 1;else if(nums[mid] > nums[right]){if(target > nums[left] && target < nums[mid]){right = mid - 1;}else{left = mid + 1;}}else{if(target > nums[mid] && target < nums[right]){left= mid + 1;}else{right = mid - 1;}}}return 0;
}

运行结果为:

4. Python语言实现

遍历法还是用python实现简单,python大法好。代码如下:

class Solution:def search(self, nums: List[int], target: int) -> bool:return True if target in nums else False

运行结果为:

LeetCode--81. 搜索旋转排序数组Ⅱ(遍历法,二分法)相关推荐

  1. LeetCode 81 搜索旋转排序数组 II

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ).编写一个函数来判断给定的目标值是否存在于数 ...

  2. 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...

  3. leetcode 81. 搜索旋转排序数组 II(二分查找)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...

  4. 81. 搜索旋转排序数组 II

    81. 搜索旋转排序数组 II Ideas 这题,,,,对Python来说一点技术含量没有. 哈哈哈哈,开个玩笑,完美的避开了考点. Code Python class Solution:def se ...

  5. LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  6. LeetCode.M33.搜索旋转排序数组

    LeetCode.M33 题目: 题目大意: ​ 将一个严格升序且没有重复元素的数组的后半部分(从k处开始)移动到前半部分,进过这个操作变成一个新的数组,然后在这个一个新的数组中查找某个元素targe ...

  7. LeetCode—33. 搜索旋转排序数组

    33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...

  8. LeetCode 33. 搜索旋转排序数组 golang

    33. 搜索旋转排序数组 三个测试用例, 这个题的难度是二分法的左侧条件很难写出来. 4 5 6 0 1 2 3 1 2 3 4 5 6 0 5 1 2 3 4 ( 例如,数组 [0,1,2,4,5, ...

  9. leetcode —— 33. 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

最新文章

  1. Spring Boot集成Dubbo多模块项目创建与配置
  2. Ubuntu下用devstack单节点部署Openstack
  3. MySQL带EXISTS关键字的子查询
  4. 还原数据库出现“因为数据库正在使用,所以无法获得对数据库的独占访问权”解决方法-
  5. Office Web Apps安装部署(一)
  6. Spring 延迟依赖查找Bean
  7. PHP array_diff_assoc
  8. c语言程序设计教程课后选择题答案,C语言程序设计教程课后习题包括答案.docx...
  9. 【语音识别】基于matlab GUI HMM 0~9数字和汉字语音识别(带面板)【含Matlab源码 1716期】
  10. amaze ui 的使用
  11. Idea报错: A JNI error has occurred
  12. 3DMax提示:单位不匹配
  13. 小程序 - 接入支付宝预授权支付 笔记
  14. Android RollBack机制实现原理剖析
  15. CH340有线USB转串与CH9140无线蓝牙转串
  16. 思科PIX防火墙配置清除
  17. Java转义字符常见坑之\u000a\u0022
  18. 【Ubuntu】APT下载工具
  19. 数据库文件的加载和挂起
  20. 提权学习:第三方软件提权(Server-u 提权)43958

热门文章

  1. wget 和 curl 区别
  2. DIoU Loss论文阅读
  3. 2018年网络规划设计师下午真题
  4. 渗透测试入门5之内网信息搜集
  5. 表数据库名_关系数据库理论:数据库的六大范式知识笔记
  6. 关于vh和 calc
  7. JavaScript---DOM事件
  8. PHP利用Mysql锁解决高并发
  9. centos65编译安装lamp和lnmp
  10. 使用DOM操纵样式表