[LeetCode]33.Search in Rotated Sorted Array

2024-02-19 03:58

本文主要是介绍[LeetCode]33.Search in Rotated Sorted Array,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目】

Search in Rotated Sorted Array

  Total Accepted: 5827  Total Submissions: 20925 My Submissions

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

【分析】

循环递增数组有这么一个性质:以数组中间元素将循环递增数组划分为两部分,则一部分为一个严格递增数组,而另一部分为一个更小的循环递增数组。

当中间元素大于首元素时,前半部分为严格递增数组,后半部分为循环递增数组;当中间元素小于首元素时,前半部分为循环递增数组;后半部分为严格递增数组。


【代码】

/*********************************
*   日期:2014-01-15
*   作者:SJF0115
*   题号: 33.Search in Rotated Sorted Array
*   来源:http://oj.leetcode.com/problems/search-in-rotated-sorted-array/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <stdio.h>
using namespace std;class Solution {
public://二分查找int search(int A[], int n, int target) {int start = 0,end = n-1;int mid;while(start <= end){mid = (start + end) / 2;if(A[mid] == target){return mid;}//中间元素大于最左边元素则左部分为有序数组else if(A[mid] >= A[start]){//目标位于左部分if(target >= A[start] && target <= A[mid]){end = mid - 1;}//目标位于右部分else{start = mid + 1;}}//中间元素小于最右边元素则右部分为有序数组else{//目标位于右部分if(target <= A[end] && target >= A[mid]){start = mid + 1;}//目标位于左部分else{end = mid - 1;}}}return -1;}
};
int main() {int result;Solution solution;int A[] = {3,1};result = solution.search(A,2,1);printf("Result:%d\n",result);return 0;
}


【分析二】

对于一个数组4,5,6,7,0,1,2 你首先找到那个转折点,就是大于下一个相邻数字的那个数字的下标,在这个数组就是数字7的下标3。

步骤:

1 找到转折点下标,把数组分成两个有序的子数组

2 如果转折点下标返回-1,意思是数组有序,可以直接在整个数组中查找

3返回不是-1,数组是旋转后的数组。 如果target大于等于第一个元素即A[0],那就在左半部分数组中查找,如果target小于A[0],那就在右半部分中寻找 

【代码二】

/*********************************
*   日期:2015-01-04
*   作者:SJF0115
*   题目: 33.Search in Rotated Sorted Array
*   来源:https://oj.leetcode.com/problems/search-in-rotated-sorted-array/
*   结果:AC
*   来源:LeetCode
*   博客:
**********************************/
#include <iostream>
using namespace std;class Solution {
public:int search(int A[], int n, int target) {if(n <= 0){return -1;}//if// 旋转转折点int pivot = FindPivot(A,n);// 数组有序if(pivot == -1){return search(A,0,n-1,target);}//ifif(A[pivot] == target){return pivot;}//if// 数组旋转// 在左半部分寻找if(A[0] <= target){return search(A,0,pivot,target);}//if// 在右半部分寻找else{return search(A,pivot+1,n-1,target);}//else}
private:int search(int A[], int start,int end, int target) {if(start > end){return -1;}// 二分查找while(start <= end){// 中间节点int mid = (start + end) / 2;// 找到if(A[mid] == target){return mid;}//if// 左半部分else if(A[mid] > target){end = mid - 1;}//else// 右半部分else{start = mid + 1;}//else}//whilereturn -1;}// 寻找转折点int FindPivot(int A[],int n){int start = 0,end = n - 1;// 数组有序if(A[end] > A[start]){return -1;}//if// 数组旋转// 二分查找while(start <= end){int mid = (start + end) / 2;// 转折点在[mid,end]区间中if(A[mid] > A[start]){start = mid;}//if// 转折点在[start,mid]区间中else if(A[mid] < A[start]){end = mid;}//elseelse{return mid;}}//while}
};int main() {Solution solution;int A[] = {4,5,6,7,0,1,2};//int A[] = {3,1};cout<<solution.search(A,7,0)<<endl;
}



这篇关于[LeetCode]33.Search in Rotated Sorted Array的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/723417

相关文章

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划