leetcode刷题:剑指 Offer 03. 数组中重复的数字 and 牛客网刷题:二分查找第一个大于等于某值的位置

图片来源leetcode
1、思考直接排序+对比前后元素,排序算法采用快排,但不知为何结果显示:超过时间限制(可能递归调用耗时较多),调用C++自带的sort排序能够实现,并不超时。
2、hash表方法,映射
3、辅助空间为O(1)的算法

class Solution {
public:

    typedef struct {
        int *elem;
        int count;
    }HashTable;
    int findRepeatNumber(vector<int>& nums) {
            //QuickSort(nums,0,nums.size()-1);
            //sort(nums.begin(),nums.end());
            //for(int i=0;i<nums.size()-1;i++)
            //{
                //if (nums[i] == nums[i+1]){
                    //return nums[i];
                //}
            //}
            //hash方法
            /*HashTable H;
            H.count  = nums.size();
            H.elem = new int [H.count];
            for(int i=0;i<nums.size();i++){
                H.elem[i] = -1;
            }
            for(int i=0;i<nums.size();i++){
                
                if (H.elem[nums[i]]!=-1)
                    return nums[i];
                else
                    H.elem[nums[i]] = nums[i];
            }
            */

            //不需要占用额外空间的解法
            for(int i=0;i<nums.size();i++){
                while(nums[i] != i){
                    if (nums[i] == nums[nums[i]])
                        return nums[i];
                    else{
                        int temp = nums[i];
                        nums[i] = nums[nums[i]];
                        nums[temp] = temp;
                    }
                }
            }


            return -1;
    }

图片来自牛客网
二分法查找:如果找到就找同大小的第一个位置,如果没有找到。最后start和end同时指向的值便为我们要的值。

class Solution {
public:
    /**
     * 二分查找
     * @param n int整型 数组长度
     * @param v int整型 查找值
     * @param a int整型vector 有序数组
     * @return int整型
     */
    int upper_bound_(int n, int v, vector<int>& a) {
        // write code here
        int m = HalfSearch(v,a,n);
        if (m<=n && m>0)
            return m;
        else
            return n+1;
    }
    int HalfSearch(int value,vector<int>& a,int n )
    {
       int mid;
        int start = 0;
        int end = n-1;
        int flag =0;
        while (start <= end )
        {
            mid = (start+end)/2;
            if ( value == a[mid] )
            {
                int temp = mid;
                while (temp >0 && a[temp] == a[temp-1])
                {
                    temp--;
                }
                return temp+1;
            }
            else if (value < a[mid])
            {
                end = mid-1;
                //flag = 1;
            }
            else{
                start = mid+1;
                //flag = 2;
            }
        }
        /*(if (flag == 1)
            return end+2;
        else*/
            return start+1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值