20200616:力扣193週週賽上

題目

  1. 一維數組的動態和
    在這裏插入圖片描述
  2. 不同整數的最少數目
    在這裏插入圖片描述

思路與算法

  1. 第一題沒啥好說的,動態和,dp最基礎的東西。
  2. 第二題主要是一個貪心的過程,既然要剩下的不同整數的數目最小,則踢出的數字的頻次最小時需要的次數最少,因此想到HashMap加貪心來實現即可。具體見代碼註釋

代碼實現

  1. 一維數組的動態和
class Solution {
    public int[] runningSum(int[] nums) {
        int len = nums.length;
        int[] res = new int[len];
        res[0] = nums[0];
        for (int i = 1; i < len; i++) {
          res[i] = res[i-1] + nums[i]; 
        }
        return res;
    }
}
  1. 不同整數的最少數目
package com.immunize.leetcode.week193;

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

/**
 * 
 * 不同整數的最少數目
 * 
 * @author Mr IMMUNIZE
 *
 */
public class Solution2 {
	public int findLeastNumOfUniqueInts(int[] arr, int k) {
		// 新建map
		Map<Integer, Integer> map = new HashMap<>();
		// 遍歷,獲取當前數字和數字的頻次存入map
		for (int i = 0; i < arr.length; i++) {
			if (map.containsKey(arr[i])) {
				map.replace(arr[i], map.get(arr[i]) + 1);
			} else {
				map.put(arr[i], 1);
			}
		}
		// k爲0則判斷有幾個不同數字即可,即map的size
		if (k == 0) {
			return map.size();
		}

		// 新建結果數組,大小爲map的size
		int[] freq = new int[map.size()];
		int a = 0;
		// 遍歷map,在val數組中填入對應數字出現的次數
		for (int key : map.keySet()) {
			freq[a++] = map.get(key);
		}

		// 將val排序,從小到大排
		Arrays.sort(freq);
		// 依次踢出數量少的數字即可
		int i = 0;
		int res = 0;
		for (i = 0; i < freq.length; i++) {
			// 如果k的值大於等於數組中最少的數目的數字,那麼需要踢出不止一個數字,則需要更新k,否則直接跳出循環。
			if (k - freq[i] >= 0) {
				k = k - freq[i];
			} else
				break;
		}
		// 總數減去已經踢出去的數
		res = freq.length - i;
		return res;
	}
}

寫在最後

  1. 學長們陸續畢業,希望自己可以向優秀的學長學姐學習,充實好自己的研學生活。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章