Jianzhi - 배열에서 시간의 절반 이상 나타나는 숫자 - 해시맵 연습

주제 설명

배열 길이의 절반 이상 발생하는 배열에 숫자가 있습니다. 이 숫자를 찾으십시오. 예를 들어 길이가 9인 배열 {1,2,3,2,2,2,5,4,2}를 입력합니다. 숫자 2는 배열의 길이의 절반을 초과하는 배열에 5번 나타나므로 2가 출력됩니다. 존재하지 않으면 0을 출력합니다.

생각의 기차

1. HashMap의 사용을 연습하면 통계가 끝납니다
2. 정렬하고 중앙값을 취합니다
3. Invincible-Moore 투표 방법입니다.

무어 투표 방식:
총 득표수: 모드가 등장하는 횟수가 배열 길이의 절반을 초과하므로, 모드에 대한 득표수가 +1이고 비보통에 대한 득표수가 -1인 경우, 그런 다음 모든 숫자 > 0의 투표 합계가 있어야 합니다.

투표의 양수 및 음수 오프셋: 배열 숫자의 모드를 x로 하고 배열의 길이를 n으로 둡니다. 첫 번째 숫자의 득표의 합이 0이면 배열의 마지막(na) 숫자의 득표의 합은 여전히 ​​>0이어야 합니다(즉, 마지막(na) 숫자의 모드는 여전히 엑스).

그것은 매우 분명한 생각이고 사실입니다.

코드

1. 해시맵 연습.

import java.util.HashMap;
import java.util.Map;

class Solution {
    
    
	public static int majorityElement(int[] nums) {
    
    
        // 创建hashmap, 数-次数
		HashMap<Integer, Integer> hash = counter(nums);
        // 遍历,选出长度大于一半的
		int res = MapEntry(hash, nums);
		return res;
	}

	public static HashMap<Integer, Integer> counter(int[] nums) {
    
    
		HashMap<Integer, Integer> count = new HashMap<Integer, Integer>();
		for (int num : nums) {
    
    
			if (count.containsKey(num)) {
    
    
				int old_v = count.get(num);
				count.put(num, old_v + 1);
			} else {
    
    
				count.put(num, 1);
			}
		}
		return count;
	}

	public static int MapEntry(HashMap<Integer, Integer> hashmap, int[] nums) {
    
    

		int res = 0;
		for (Map.Entry<Integer, Integer> entry : hashmap.entrySet()) {
    
    
			
			if (entry.getValue() > (nums.length / 2)) {
    
    
				res = entry.getKey();
			}
		}
		return res;
	}
}

2. 정렬 안 함
3. 무어 투표 방식

class Solution {
    
    
    public int majorityElement(int[] nums) {
    
    
        int x = 0, votes = 0;
        for(int num : nums){
    
    
            if(votes == 0) x = num;
            votes += num == x ? 1 : -1;
        }
        return x;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_32301683/article/details/108503321
Recomendado
Clasificación