>  기사  >  백엔드 개발  >  PHP에서 현재 숫자보다 작은 숫자의 수를 계산하는 방법

PHP에서 현재 숫자보다 작은 숫자의 수를 계산하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-07-08 15:57:282206검색

nums라는 배열이 주어졌습니다. 각 요소 nums[i]에 대해 배열에서 그보다 작은 모든 숫자의 수를 세어보세요. 오늘은 편집자가 현재 숫자보다 작은 숫자가 몇 개인지 계산하는 방법을 소개하겠습니다. 필요하시면 참고하시면 됩니다.

PHP에서 현재 숫자보다 작은 숫자의 수를 계산하는 방법

각 요소 nums[i]에 대해 배열에서 그보다 작은 모든 숫자의 수를 세어보세요.

즉, 각 nums[i]에 대해 j != i 및 nums[j] < nums[i] 와 같은 유효한 j 수를 계산해야 합니다.

답을 배열로 반환합니다.

예 1:

输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释: 
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。 
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。 
对于 nums[3]=2 存在一个比它小的数字:(1)。 
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

예 2:

输入:nums = [6,5,4,8]
输出:[2,1,0,3]

예 3:

输入:nums = [7,7,7,7]
输出:[0,0,0,0]

팁:

  • 2 <= nums.length <= 5 00

  • 0 < = nums[i] <= 100

해결 방법 아이디어 1

배열의 각 숫자를 열거하고, 배열을 순회하며 현재 숫자보다 작은 숫자의 개수를 세어보세요.

Code

class Solution {
    /** 
    * @param Integer[] $nums 
    * @return Integer[] 
    */
    function smallerNumbersThanCurrent($nums) {
        $count = count($nums);
        $result = array_fill(0, $count, 0);
        for ($i = 0; $i < $count; $i++) {
            for ($j = 0; $j < $count; $j++) {
                if ($nums[$j] < $nums[$i]) {
                    $result[$i]++;
                }
            }
        }
        return $result;
    }}

해결 방법 질문 아이디어 2 - 주파수 배열 + 접두어 합

숫자의 값 범위는 [0,100][0,100]이므로 숫자의 횟수를 나타내는 빈도 배열 cnt[i]cnt[i]를 만드는 것을 고려할 수 있습니다. ii가 나타납니다. 즉, 숫자 ii의 경우 그 답, 즉 그보다 작은 숫자의 발생 횟수의 합은 [0,i-1][0,i−1을 순회해야 하는 cntcnt 합을 직접 계산합니다. ] 계산에는 여전히 선형 시간이 필요하지만 답은 접두사 합계이므로 cntcnt 배열에 대한 접두사 합계를 계산할 수 있습니다. 그러면 숫자 ii에 대한 답은 cnt[i-1]cnt[i−1]이고, 답을 계산하는 시간 복잡도는 O(n)O(n)에서 O(1)O(1)로 감소됩니다.

최종 알고리즘 프로세스는 배열 요소를 순회하고 cntcnt 배열, 즉 cnt[nums[i]]+=1을 업데이트한 다음 cntcnt 배열의 접두어 합계를 계산하고 마지막으로 배열 요소를 순회하는 것입니다. 해당 숫자 O(1)O (1) 그냥 답을 얻으세요.

카운팅 정렬은 특별한 종류의 버킷 정렬로, 일반적으로 정렬된 데이터 길이 n이 k 유형보다 훨씬 큰 상황에 적합합니다. 예를 들어, 이 질문에서는 k=101, n=500, 심지어 5000입니다.

Code

class Solution {
    /** 
    * @param Integer[] $nums 
    * @return Integer[] 
    */
    function smallerNumbersThanCurrent($nums) {
        $count = count($nums);
        $cnt = array_fill(0, 101, 0);    // 填充 0 的计数数组
        $result = array_fill(0, $count, 0);   // 填充 0 的结果数组
        // $nums 中出现的值和数量对应落到 $cnt 中
        foreach ($nums as $num) {
            $cnt[$num]++;
        }
        // $cnt 转化成 $i 的值是 sum($cnt[0], .. $cnt[$i - 1]) 新数组,即为小于 $i 的数据数量
        foreach (range(1, 100) as $i) {
            $cnt[$i] += $cnt[$i - 1];
        }
        // 结果数组中出现的 索引值 替换为 计数数组中的 数量
        foreach (range(0, $count - 1) as $i) {
            if ($nums[$i]) {
                $result[$i] = $cnt[$nums[$i] - 1];
            }
        }
        return $result;
    }}

추천 학습: php 비디오 튜토리얼

위 내용은 PHP에서 현재 숫자보다 작은 숫자의 수를 계산하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 hxd.life에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제