LeetCode--81. 搜索旋转排序数组Ⅱ(遍历法,二分法)
搜索旋转排序数组Ⅱ(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. 搜索旋转排序数组Ⅱ(遍历法,二分法)相关推荐
- LeetCode 81 搜索旋转排序数组 II
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ).编写一个函数来判断给定的目标值是否存在于数 ...
- 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...
- leetcode 81. 搜索旋转排序数组 II(二分查找)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...
- 81. 搜索旋转排序数组 II
81. 搜索旋转排序数组 II Ideas 这题,,,,对Python来说一点技术含量没有. 哈哈哈哈,开个玩笑,完美的避开了考点. Code Python class Solution:def se ...
- LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...
- LeetCode.M33.搜索旋转排序数组
LeetCode.M33 题目: 题目大意: 将一个严格升序且没有重复元素的数组的后半部分(从k处开始)移动到前半部分,进过这个操作变成一个新的数组,然后在这个一个新的数组中查找某个元素targe ...
- LeetCode—33. 搜索旋转排序数组
33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...
- 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, ...
- leetcode —— 33. 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
最新文章
- Spring Boot集成Dubbo多模块项目创建与配置
- Ubuntu下用devstack单节点部署Openstack
- MySQL带EXISTS关键字的子查询
- 还原数据库出现“因为数据库正在使用,所以无法获得对数据库的独占访问权”解决方法-
- Office Web Apps安装部署(一)
- Spring 延迟依赖查找Bean
- PHP array_diff_assoc
- c语言程序设计教程课后选择题答案,C语言程序设计教程课后习题包括答案.docx...
- 【语音识别】基于matlab GUI HMM 0~9数字和汉字语音识别(带面板)【含Matlab源码 1716期】
- amaze ui 的使用
- Idea报错: A JNI error has occurred
- 3DMax提示:单位不匹配
- 小程序 - 接入支付宝预授权支付 笔记
- Android RollBack机制实现原理剖析
- CH340有线USB转串与CH9140无线蓝牙转串
- 思科PIX防火墙配置清除
- Java转义字符常见坑之\u000a\u0022
- 【Ubuntu】APT下载工具
- 数据库文件的加载和挂起
- 提权学习:第三方软件提权(Server-u 提权)43958