题目名称
- Search in Rotated Sorted Array(Leetcode #33)
- Search in Rotated Sorted ArrayⅡ ( Leetcode #81)
- 二维数组查找(剑指offer #4)
- 替换空格(剑指offer #5)
Search in Rotated Sorted Array(Leetcode #33)
题目描述
Suppose an array sorted in ascending order 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.Your algorithm’s runtime complexity must be in the order of O(log n).
解题思路
本题数组不含有重复元素,此外指定时间复杂度为O(logn),必须采用二分。本题的关键在于:若nums[m]>=nums[l],则[l,m]必为升序。
解题方案
1 | class Solution { |
扩展
本题还有一种解法,即首先二分找出最小元素(必为翻转点),此后利用传统二分查找即可。找出最小元素的算法如下所示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.empty()) return -1;
else if(nums.size()==1) return 0;
size_t lo = 0;
size_t hi = nums.size() - 1;
while (lo < hi) {
size_t mid = lo+(hi-lo)/2;
if (nums[mid] > nums[mid + 1])
return nums[mid + 1];
if (nums[hi] < nums[mid])
lo = mid + 1;
else
hi = mid;
}
return lo;
}
};
(本方案结合下题,稍加改进即可解决剑指offer#11)。如果当前需要寻找旋转(且带有重复元素)数组的max,笔者认为需要将比对区间由[mid,hi]改为[lo,mid],此想法尚未验证。
Search in Rotated Sorted ArrayⅡ ( Leetcode #81)
题目描述
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).You are given a target value to search. If found in the array return true, otherwise return false.
解题思路
在本题中允许重复,因此若nums[m]>=nums[l],则[l,m]为升序的推论不成立(见上一题解决方案Line10)。反例为:[1,2,1,1,1];
我们将nums[m]>=nums[l]分为两种可能:
- nums[m]>nums[l],则区间[l,m]必为升序
- nums[m]==nums[l],自增l,观察结果
解题方案
1 | class Solution { |
二维数组查找
题目描述
现有一二维数组,元素按照每一行从左向右递增,每一列从上向下的规律排序完毕,试以线性时间完成元素查找。
解题思路
从左下角或右上角开始查找即可。试以左下角为例,小则向上,大则向右。
解题方案
1 | class Solution { |
替换空格
题目描述
将某字符串内所有空格替换为”%20”。
解题思路
暴力法需要对线性表进行反复插入,造成不必要的开销。应当预判替换完毕的线性表长度,然后倒序遍历字符串完成拷贝操作。
解题方案
1 | class Solution { |