旋转数组求最小值
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1
输入:
[3,4,5,1,2]
输出:
1
解:
该题采用二分查找的方法。
首先取中间元素,然后和数组左边元素进行比较。
由于数组是部分有序:
- 如果arr[ mid ] < arr[ low ],说明 mid 左部不是一直递增的,一定存在最小值转折点(包括arr[ mid ]也可能是最小值),则在左部搜索:high = mid;
- 如果arr[ mid ] >= arr[ low ],最小值左半部分一定大于最小值右半部分,因此说明mid前半部分一定是递增的,最小值则在右半部分,在右部搜索:low = mid+1;
- 特殊情况:数组是递增的,则不满足前两条,需要额外进行判断。
若arr[ low ] < arr[ high ]:数组递增,最小值为arr[ low ];
!题意旋转数组不存在递减情况,因此不用考虑
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int high = rotateArray.size()-1;
int low = 0;
int mid = 0;
while(low < high)
{
if(rotateArray[low] < rotateArray[high])
return rotateArray[low];
mid = (low+high)/2;
if(rotateArray[mid] < rotateArray[low])
{
high = mid;
}
else
{
low = mid+1;
}
}
return rotateArray[low];
}
};
求字符串中第一个只出现一次的字符
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
示例1
输入:
“google”
输出:
4
解
设置一个哈希表:<char , int>,字符串中字符对应该字符出现次数
- 遍历一遍数组,求出str每个字符在哈希表中的值
- 在遍历一遍,字符串,如果字符在哈希表中次数为1,则返回。
class Solution {
public:
int FirstNotRepeatingChar(string str) {
unordered_map<char,int> mapCharToCount;
int i=0;
for(i=0 ; i<str.length() ; i++)
{
mapCharToCount[str[i]]++;
}
for(i=0 ; i<str.length() ; i++)
{
if(mapCharToCount[str[i]] == 1)
return i;
}
return -1;
}
};