首页 > 编程语言 >力扣81(java&python)-搜索旋转排序数组 II(中等)

力扣81(java&python)-搜索旋转排序数组 II(中等)

时间:2022-11-24 10:56:31浏览次数:47  
标签:right java target nums python mid II int left

题目:

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。

给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。

你必须尽可能减少整个操作步骤。

 

示例 1:

输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true
示例 2:

输入:nums = [2,5,6,0,0,1,2], target = 3
输出:false
 

提示:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -104 <= target <= 104

进阶:

  • 这是 搜索旋转排序数组 的延伸题目,本题中的 nums  可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-in-rotated-sorted-array-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

 注意:这里面有重复元素,对于像[1,3,1,1,1]这种数组,很难通过nums[left]和nums[mid]比较来判断两个升序区间的位置,但是可以通过比较nums[mid]与nums[left]是否相同,来排除重复数字,如果nums[mid] == nums[left]说明有重复的数字,让left向右移动来排除重复数字。

题目中说将数据进行旋转,这样的话就会将搜索区间从中间一分为二,位于中间的元素nums[mid]一定会在其中一个有序的区间中。当nums[mid]与target相等时,直接返回true。后续不等的情况,讨论mid与左边界的大小关系,分为两种情况:

1.mid的值大于等于左边界时:nums[mid] >= nums[left]

  •  此时在区间[left, mid - 1]内的元素一定是有序的,如果target在[left, mid -1]里,即nums[left] <= target < nums[mid],此时设置right = mid - 1;
  • 上一个区间的反面,target在区间[mid, right]中,left == mid;

2.mid的值小于左边界时:nums[mid] < nums[left]

  •  此时在区间[mid, right]内的元素一定是有序的,为了两种情况left和right变化一致,这里是假设如果target在[mid, right]里,即nums[mid] <= target <=nums[right],此时设置left = mid ;
  • 上一个区间的反面,target在区间[left, mid - 1]中,right == mid - 1;

注意:这里的区间存在[mid, right],为了防止区间只有两个元素的时候,向下取整会让mid一直和left相同,出现死循环,故需要变成向上取整mid = left + (right - left + 1) / 2。

java代码(left < right):

 1 class Solution {
 2     public boolean search(int[] nums, int target) {
 3         int left = 0, right = nums.length - 1;
 4         while (left < right){
 5             int mid = left + (right - left + 1) / 2;
 6             if (nums[mid] == target) return true;
 7             if (nums[left] == nums[mid]){
 8                 left++;
 9                 continue;
10             }
11             if (nums[mid] >= nums[left]){
12                 if (target < nums[mid] && target >= nums[left]){
13                     right = mid - 1;
14                 }else{
15                     left = mid;
16                 }
17             }else{
18                 if (target >= nums[mid] && target <= nums[right]){
19                     left = mid;
20                 }else{
21                     right = mid - 1;
22                 }   
23             }
24         }
25         return nums[left] == target;
26     }
27 }

python代码:

 1 class Solution:
 2     def search(self, nums: List[int], target: int) -> bool:
 3         left, right = 0, len(nums) - 1
 4         while left < right:
 5             mid = left + (right - left + 1) // 2
 6             if nums[mid] == target:
 7                 return True
 8             if nums[left] == nums[mid]:
 9                 left += 1
10                 continue
11             if nums[mid] >= nums[left]:
12                 if nums[left] <= target < nums[mid]:
13                     right = mid - 1
14                 else:
15                     left = mid
16             else:
17                 if nums[mid] <= target <= nums[right]:
18                     left = mid
19                 else:
20                     right = mid - 1
21         return True if nums[left] == target else False

java代码(left <= right):

 1 class Solution {
 2     public boolean search(int[] nums, int target) {
 3         int left = 0, right = nums.length - 1;
 4         while (left <= right){
 5             int mid = left + (right - left) / 2;
 6             if (nums[mid] == target) return true;
 7             if (nums[left] == nums[mid]){
 8                 left++;
 9                 continue;
10             }
11             //左边有序
12             if (nums[mid] >= nums[left]){
13                 if (target < nums[mid] && target >= nums[left]){
14                     right = mid - 1;
15                 }else{
16                     left = mid + 1;
17                 }
18             }else{
19                 if (target > nums[mid] && target <= nums[right]){
20                     left = mid + 1;
21                 }else{
22                     right = mid - 1;
23                 }   
24             }
25         }
26         return false;
27     }
28 }

标签:right,java,target,nums,python,mid,II,int,left
From: https://www.cnblogs.com/liu-myu/p/16920921.html

相关文章

  • ValueError:only one element tensors can be converted to Python scalars解决办法
    问题描述深度学习初学者的我在使用pytorchdebug深度神经网络模型的时候,list,tensor,array之间的转化太复杂了,总是傻傻分不清。这次又遇到问题:ValueError:onlyoneelement......
  • Windows Server 2012 R2 搭建IIS FTP 服务器
    这篇文章着重给大家讲解如何利用WindowsServer2012R2搭建本地IISFTP服务器环境:虚拟机:VMwareWindowsServer2012R2创建新首页删除默认文档......
  • python代码报错No module named numpy问题
    1一般在“控制面板+cmd”中安装​​numpy​​在​​命令行​​窗口中输入"pipinstallnumpy"此时安装的numpy并不在python的目录行中则会出现Nomodulenamednumpy报错,即......
  • Java重点 | 抽象
    抽象抽象的概念抽象方法和抽象类的格式抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束。抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abs......
  • Python基础之字符串
    一、认识字符串字符串是Python中最常⽤的数据类型。我们⼀般使⽤引号来创建字符串。创建字符串很简单,只要为变量分配⼀个值即可。1、字符串特征⼀对引号字符串name1='To......
  • Spring-纯Java创建一个SSM【webapp】
    纯Java搭建webappQuickStart使用纯Java来搭建一个SSM环境,即在项目中,不存在任何XML配置,包括web.xml1创建一个Maven工程引入依赖<!--TODO【Java创建SSM】1......
  • Java中的集合实现赌神、赌圣、赌侠斗地主
    ♣准备牌代码如下://定义一个存储54张牌的ArrayList集合,泛型使用StringArrayList<String>poker=newArrayList<>();//定义两个数组,一个数组存储牌的花色,一个数组存......
  • Python的特点有哪些?
    python的五个特点:1、简单易学python是一种代表简单主义思想的语言,阅读一个良好的python程序就感觉像是在读英语段落一样,尽管这个英语段的语法要求非常严格。python最大的优......
  • 在JavaScript中使用filter()的4个实用案例
    英文| https://medium.com/javascript-in-plain-english/4-practical-use-cases-of-using-filter-in-javascript-db46e2ec83b2翻译|web前端开发创建一个包含给定数组元......
  • python主要可以做什么
    python主要可以做Web和Internet开发、科学计算和统计、桌面界面开发、软件开发、后端开发等领域的工作。Python是一种解释型脚本语言。Python可以应用于众多领域,如:数据分......