LeetCode (34)Search for a Range
来源:互联网 发布:2016淘宝不能刷单了 编辑:程序博客网 时间:2024/06/03 21:46
(34)Search for a Range
题目:给定升序排序的整数数组,找到给定目标值的起始和终止位置,算法运行时间复杂度必须为O(logn)的时间复杂度,如果在数组中找不到目标,则返回[-1, -1]。
例如:
给定数组为[5, 7, 7, 8, 8, 10]和目标值8,返回[3, 4]。
根据这道题的思路,最开始打算找整个目标数组的位置,这让就能得到整个数组的首尾,但是后来发现两端的处理并不是很容易,所以选择了2*O(logn)的方法就是分别求两端的位置。
看到O(logn)就应该知道是二分法了,然后再二分的过程中,分别找左端和右端位置,拿左端为例:当中位数是大于或等于目标数字的时候,由于已经是排好序的,那么就递归查找左半侧,当中位数是小于目标数字的时候,递归查找右半侧;右端的时候就分为中位数大于,小于等于两种可能,为什么自己画图考虑一下就明白了。
下面是代码:
class Solution {public: int search_left(vector<int> nums, int left_num, int right_num, int target){ int mid = (left_num + right_num) / 2; if(nums[left_num] == target){ return left_num; } if(left_num == right_num){ if(target == nums[left_num]){ return left_num; } else{ return -1; } } if(left_num + 1 == right_num){ if(target == nums[left_num]){ return left_num; } else if(target == nums[right_num]){ return right_num; } else{ return -1; } } if(nums[mid] >= target){ return search_left(nums, left_num, mid, target); } else if(nums[mid]<target){ return search_left(nums, mid, right_num, target); } } int search_right(vector<int> nums, int left_num, int right_num, int target){ int mid = (left_num + right_num) / 2; if(nums[right_num] == target){ return right_num; } if(left_num == right_num){ if(target == nums[right_num]){ return right_num; } else{ return -1; } } if(left_num + 1 == right_num){ if(target == nums[right_num]){ return right_num; } else if(target == nums[left_num]){ return left_num; } else{ return -1; } } if(nums[mid] <= target){ return search_right(nums, mid, right_num, target); } else if(nums[mid]>target){ return search_right(nums, left_num, mid, target); } } vector<int> searchRange(vector<int>& nums, int target) { if(nums.size()==0){ vector<int> v; v.push_back(-1); v.push_back(-1); return v; } int lef = search_left(nums, 0, nums.size()-1, target); int rig = search_right(nums, 0, nums.size()-1, target); vector<int> v; v.push_back(lef); v.push_back(rig); return v; }};
阅读全文
0 0
- LeetCode(34)Search for a Range
- LeetCode (34)Search for a Range
- LeetCode(34)Search for a Range
- [LeetCode] Search for a Range [34]
- LeetCode 34 Search for a Range
- [leetcode 34] Search for a Range
- Leetcode NO.34 Search for a Range
- [LeetCode 34]Search for a Range
- leetcode-34 Search for a Range
- Leetcode 34 Search for a Range
- Search for a Range - LeetCode 34
- leetcode 34 -- Search for a Range
- leetcode 34: Search for a Range
- Leetcode#34 Search for a Range
- LeetCode(34) Search for a Range
- LeetCode 34: Search for a Range
- [Leetcode 34, Medium] Search for a Range
- [leetcode-34]Search for a Range(C)
- Ue4导入视频黑屏原因
- Python图像批处理(图像重采样)
- Intellij Idea + ionic 环境配置的一些问题整理
- Jquery中$(document).ready()和window.onload的区别
- 剑指offer-二进制中1的个数
- LeetCode (34)Search for a Range
- today extension 开发笔记
- Java 读取Properties配置文件
- vue在路由过程中,改变导航栏的单个点击样式的问题。
- find the nth digit
- spring读取properties
- 【ironic】ironic介绍与原理
- AVL树及C语言实现
- 将普通编译时异常封装进运行时异常抛出