20200616:力扣193周周赛上

力扣193周周赛上

  • 题目
  • 思路与算法
  • 代码实现
  • 写在最后

题目

  1. 一维数组的动态和
    20200616:力扣193周周赛上_第1张图片
  2. 不同整数的最少数目
    20200616:力扣193周周赛上_第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. 学长们陆续毕业,希望自己可以向优秀的学长学姐学习,充实好自己的研学生活。

你可能感兴趣的:(leetcode学习记录篇)