2023-10-07:用 go 语言,给定 n 个二维坐标,表示在二维平面的 n 个点,
坐标为 double 类型,精度最多小数点后两位,
希望在二维平面上画一个圆,圈住其中的 k 个点,其他的 n-k 个点都要在圆外。
返回一个圆心和半径,表示哪个圆可以圈住其中的 k 个点。
坐标和半径都是 double 类型,最多保留小数点后两位。
下面是正式题目,
给你一个整数数组 arr 和一个整数 k,
现需要从数组中恰好移除 k 个元素。
请找出移除后数组中不同整数的最少数目。
输入:arr = [4,3,1,1,3,3,2], k = 3。
输出:2。
来自美团面试题。
来自左程云。
答案 2023-10-07:
大体步骤如下:
1.创建一个 map m,用于存储数组 arr 中每个整数出现的次数。
2.遍历数组 arr,统计每个整数出现的次数,并保存在 map m 中。
3.创建一个数组 cnts,用于存储 map m 中的值(即整数出现的次数)。
4.将 cnts 数组排序,以便移除出现次数少的整数。
5.初始化一个变量 i 为 0,用于记录已移除的整数个数。
6.遍历排序后的 cnts 数组:
减去当前整数出现的次数 k,并将结果保存在变量 k 中。
如果 k 小于等于 0,说明已经移除了足够的整数,退出循环。
如果 k 等于 0,说明恰好移除了整数的次数,将变量 i 加 1。
7.返回剩下的整数个数,即 len(cnts)减去已移除的整数个数 i。
总的时间复杂度为 O(nlogn),其中 n 为数组 arr 的长度,主要消耗在排序 cnts 数组上。额外空间复杂度为 O(n),用于存储 map m 和数组 cnts。
go 完整代码如下:
package main
import (
"fmt"
"sort"
)
func findLeastNumOfUniqueInts(arr []int, k int) int {
m := make(map[int]int)
for _, num := range arr {
m[num]++
}
cnts := make([]int, 0, len(m))
for _, cnt := range m {
cnts = append(cnts, cnt)
}
sort.Ints(cnts)
i := 0
for ; i < len(cnts); i++ {
k -= cnts[i]
if k <= 0 {
if k == 0 {
i++
}
break
}
}
return len(cnts) - i
}
func main() {
arr := []int{4, 3, 1, 1, 3, 3, 2}
k := 3
result := findLeastNumOfUniqueInts(arr, k)
fmt.Println(result)
}
复制代码
rust 完整代码如下:
use std::collections::HashMap;
fn find_least_num_of_unique_ints(arr: Vec<i32>, mut k: i32) -> i32 {
let mut map: HashMap<i32, i32> = HashMap::new();
for num in arr {
let count = map.entry(num).or_insert(0);
*count += 1;
}
let n = map.len();
let mut cnts: Vec<i32> = Vec::with_capacity(n);
for &cnt in map.values() {
cnts.push(cnt);
}
cnts.sort();
let mut i = 0;
for cnt in &cnts {
k -= cnt;
if k <= 0 {
if k == 0 {
i += 1;
}
break;
}
i += 1;
}
(n - i) as i32
}
fn main() {
let arr = vec![4, 3, 1, 1, 3, 3, 2];
let k = 3;
let result = find_least_num_of_unique_ints(arr, k);
println!("{}", result);
}
复制代码
c++完整代码如下:
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
int findLeastNumOfUniqueInts(std::vector<int>& arr, int k) {
std::unordered_map<int, int> map;
for (int num : arr) {
map[num]++;
}
int n = map.size();
std::vector<int> cnts;
for (auto& pair : map) {
cnts.push_back(pair.second);
}
std::sort(cnts.begin(), cnts.end());
int i = 0;
for (i = 0; i < n; i++) {
k -= cnts[i];
if (k <= 0) {
if (k == 0) {
i++;
}
break;
}
}
return n - i;
}
int main() {
std::vector<int> arr = { 4, 3, 1, 1, 3, 3, 2 };
int k = 3;
int result = findLeastNumOfUniqueInts(arr, k);
std::cout << result << std::endl;
return 0;
}
复制代码
c 完整代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int key;
int value;
} Pair;
int compare(const void* a, const void* b) {
return ((Pair*)a)->value - ((Pair*)b)->value;
}
int findLeastNumOfUniqueInts(int* arr, int arrSize, int k) {
Pair* map = (Pair*)malloc(arrSize * sizeof(Pair));
int size = 0;
for (int i = 0; i < arrSize; i++) {
int key = arr[i];
int found = 0;
for (int j = 0; j < size; j++) {
if (map[j].key == key) {
map[j].value++;
found = 1;
break;
}
}
if (!found) {
map[size].key = key;
map[size].value = 1;
size++;
}
}
qsort(map, size, sizeof(Pair), compare);
int i = 0;
for (; i < size; i++) {
k -= map[i].value;
if (k <= 0) {
if (k == 0) {
i++;
}
break;
}
}
free(map);
return size - i;
}
int main() {
int arr[] = { 4, 3, 1, 1, 3, 3, 2 };
int arrSize = sizeof(arr) / sizeof(arr[0]);
int k = 3;
int result = findLeastNumOfUniqueInts(arr, arrSize, k);
printf("%d\n", result);
return 0;
}
复制代码
评论