0
点赞
收藏
分享

微信扫一扫

剑指Offer04

zmhc 2022-04-14 阅读 71

03. 数组中重复的数字

找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        if(nums.empty())
        {
            return -1;
        }
        sort(nums.begin(), nums.end());
        int size = nums.size();
        for(int i = 0; i < size; i++)
        {
            if(nums[i] < 0 || nums[i] > size-1)
                return -1;
            if(nums[i] == nums[i+1])
                return nums[i];
        }
        return -1;
    }
};

53(1).在排序数组中查找数字

统计一个数字在排序数组中出现的次数。

在这里插入图片描述

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int i = 0;
        int j = nums.size()-1;
        while(i <= j)
        {
            int m = (i+j)/2;
            if(nums[m] <= target)
                i = m+1;
            else
                j = m-1;
        }
        int right = i;
        if(j >= 0 && nums[j] != target) 
            return 0;
        i = 0;
        j = nums.size()-1;
        while(i <= j)
        {
            int m = (i+j)/2;
            if(nums[m] < target)
                i = m+1;
            else
                j = m-1;
        }
        int left = j;
        return right-left-1;
    }
};

53(2). 0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int i = 0;
        int j = nums.size()-1;
        while(i <= j)
        {
            int m = (i+j)/2;
            if(nums[m] != m)
            {
                if(m == 0 || nums[m-1] == m-1){
                    return m;
                }
                j = m - 1;
            }else{
                i = m + 1;
            }
        }
        if(i == nums.size()){
            return i;
        }
        return -1;
    }
};
举报

相关推荐

0 条评论