leetcode
来源:互联网 发布:软件结项文档 编辑:程序博客网 时间:2024/05/20 00:15
Question33–Search in Rotated Sorted Array
给你一个按升序排列的“循环数组”(元素各不相同),即最小元素可以在数组的任意位置。eg:[1,2,3,4,5];[4,5,1,2,3]; []; [1]。同时给你一个目标元素target,返回其在数组中的下标。若不在数组中,返回-1。
method 1
从头到尾扫一遍,返回相同元素的下标。
code:
int search(vector<int>& nums, int target) { for(int i=0; i<nums.size(); i++){ if(nums[i]==target) return i; } return -1; }
复杂度:O(n)
method 2
- 用二分法找到最小元素的下标。
- 然后将target 和数组最后一个元素比较,确定target落在哪一块。
- 然后在一块中用二分查找,返回target下标。
code:
int search(vector<int>& nums, int target) { int i=0, j=nums.size()-1; int min; if(j==-1) return -1; while(i<j){ int mid=(i+j)/2; if(nums[j]<nums[mid]) i=mid+1; else j=mid; } min=i; if(target<nums.back()){ i=min; j=nums.size()-1; } else if(target>nums.back()){ i=0; j=min-1; } else return nums.size()-1; while(i<=j){ int mid=(i+j)/2; if(nums[mid]==target) return mid; else if(nums[mid]>target) j=mid-1; else i=mid+1; } return -1; }
复杂度: O(log n)
method 3
在method2的基础上改进,在找到最小元素的下标后,直接在原数组上进行二分查找,只不过每次都要加一个最小元素的下标并除以数组长度后取余。
code
int search(vector<int>& nums, int target) { int i=0, j=nums.size()-1; int min; while(i<j){ int mid=(i+j)/2; if(nums[j]<nums[mid]) i=mid+1; else j=mid; } min=i; i=0; j=nums.size()-1; while(i<=j){ int mid=(i+j)/2; int realmid=(mid+min)%nums.size(); if(nums[realmid]==target) return realmid; else if(nums[realmid]>target) j=mid-1; else i=mid+1; } return -1; }
复杂度: O(log n)
阅读全文
0 0
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode:
- leetcode
- Studio像Eclipse一样设置switch/case那样的代码块
- 搜狗2016研发工程师编程题
- iOS-Xcode 上传App Store遇到 Unexpected CFBundleExecutable Key问题
- sql文件反向生成物理概念模型
- 黑客工具软件大全100套
- leetcode
- 网络安全之相关攻击方式总结
- Kotlin从入门到放弃之基础篇(五)——修饰词、扩展、数据类
- 机器学习_协方差
- Servlet Session(会话)
- Util-ImageLoaderutil
- Android 使用本地服务器编译apk教程
- JDK 7 和 JDK8 的区别
- POJ 2299 Ultra-QuickSort