2021-05-05 旋转数组求最小值 求字符串中第一个只出现一次的字符

旋转数组求最小值

题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1
输入:
[3,4,5,1,2]
输出:
1

解:

该题采用二分查找的方法。
首先取中间元素,然后和数组左边元素进行比较。
由于数组是部分有序:

  1. 如果arr[ mid ] < arr[ low ],说明 mid 左部不是一直递增的,一定存在最小值转折点(包括arr[ mid ]也可能是最小值),则在左部搜索:high = mid;
  2. 如果arr[ mid ] >= arr[ low ],最小值左半部分一定大于最小值右半部分,因此说明mid前半部分一定是递增的,最小值则在右半部分,在右部搜索:low = mid+1;
  3. 特殊情况:数组是递增的,则不满足前两条,需要额外进行判断。
    若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>,字符串中字符对应该字符出现次数

  1. 遍历一遍数组,求出str每个字符在哈希表中的值
  2. 在遍历一遍,字符串,如果字符在哈希表中次数为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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值