Likou 브러싱 노트 day7 (배열에서 반복되는 숫자 + 정렬된 배열에서 숫자 검색 + 0에서 n-1까지 누락된 숫자)

배열의 반복되는 숫자

주제

여기에 이미지 설명 삽입

생각의 기차

해시 테이블을 생성하고, 배열을 순회하고, 존재하지 않는 경우 해시 테이블에 추가하고, 존재하는 경우 직접 반환

코드

var findRepeatNumber = function(nums) {
    
    
    let map = new Map();
    for(let i=0;i<nums.length;i++)
    {
    
    
        if(!map.has(nums[i]))
        {
    
    
            map.set(nums[i],i)
        }else{
    
    
            return nums[i]
        }
    }
    return null
};

정렬된 배열에서 데이터 찾기

주제

여기에 이미지 설명 삽입

생각의 기차

targetLeft와 targetRight를 다음 표로 목표 값의 양면과 동일하게 정의한 다음 이진 검색을 사용하여 targetLeft와 targetRight를 얻고 마지막으로 둘을 빼고 1을 더하여 결과를 얻습니다. targetLeft를 계산하는 단계는 다음과 같습니다
.

  • 먼저 targetLeft를 -1과 같은 임의의 값으로 정의하고 각각 배열의 첫 번째 요소와 마지막 요소를 가리키는 왼쪽 및 오른쪽 포인터를 정의합니다.

여기에 이미지 설명 삽입

  • 그런 다음 그림 2와 같이 중간 포인터 mid를 계산하고 nums[2]=7<target을 판단합니다.

여기에 이미지 설명 삽입

  • 그런 다음 left=mid+1로 만듭니다.

여기에 이미지 설명 삽입

  • 그런 다음 mid=4, nums[4]==target을 계산합니다.

여기에 이미지 설명 삽입

  • targetLeft=중간

여기에 이미지 설명 삽입

  • 오른쪽=중간-1

여기에 이미지 설명 삽입

  • 이때 left=right이므로 루프를 계속 진행하고 mid=3, nums[3]=target을 계산합니다.

여기에 이미지 설명 삽입

  • 따라서 targetLeft=mid=3

여기에 이미지 설명 삽입

  • right=mid-1, 이때 right<left, 루프 밖으로 점프한다.

여기에 이미지 설명 삽입
targetRight를 찾는 단계는 동일합니다.

코드

var search = function (nums, target) {
    
    
    var targetLeft = -1,
        targetRight = -1,
        left=0,
        right=nums.length-1;
    //找出该数在左边第一次出现的位置
    while (left<=right) {
    
    
        var mid = Math.floor((left + right) / 2);
        if (target == nums[mid]) {
    
    
            targetLeft = mid;   //记录下第一次出现的下标
            right=mid - 1;    //继续向前查找是否该数出现过
        } else if (target < nums[mid]) {
    
    
            right = mid -1;
        } else {
    
    
            left = mid + 1;
        }
    }
    //重置 left 和 right 的值,找出该数在右边最后一个出现的位置
    left = 0;
    right = nums.length - 1;
    while (left <= right) {
    
    
        var mid = Math.floor((left + right) / 2);
        if (target == nums[mid]) {
    
    
            targetRight = mid;
            left = mid + 1;
        } else if (target < nums[mid]) {
    
    
            right = mid - 1;
        } else {
    
    
            left = mid + 1;
        }
    }
    return targetLeft<=targetRight&&targetLeft!==-1 ? targetRight - targetLeft + 1 : 0;
};

0에서 n-1까지 숫자 누락

주제

여기에 이미지 설명 삽입

생각의 기차

수학 공식을 사용하여 0-n의 합을 계산한 다음 숫자의 합을 빼서 누락된 숫자를 구합니다.

코드

var missingNumber = function(nums) {
    
    
    const n = nums.length + 1;
    let total = Math.floor(n * (n - 1) / 2);
    let arrSum = 0;
    for (let i = 0; i < n - 1; i++) {
    
    
        arrSum += nums[i];
    }
    return total - arrSum;
};

Je suppose que tu aimes

Origine blog.csdn.net/weixin_51610980/article/details/128408614
conseillé
Classement