给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数
输入: candies = [1,1,2,2,3,3]
输出: 3
解析: 一共有三种种类的糖果,每一种都有两个。
最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。
示例 2 :
输入: candies = [1,1,2,3]
输出: 2
解析: 妹妹获得糖果[2,3],弟弟获得糖果[1,1],妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。
思路:1.判断糖果的种类,先排序然后找不同,注意最大值
2.哈希表
1的代码:
void merge(int arr[], int low, int mid, int high){
int i, k;
int *tmp = (int *)malloc((high-low+1)*sizeof(int));
int left_low = low;
int left_high = mid;
int right_low = mid + 1;
int right_high = high;
for(k=0; left_low<=left_high && right_low<=right_high; k++){
if(arr[left_low]<=arr[right_low]){
tmp[k] = arr[left_low++];
}else{
tmp[k] = arr[right_low++];
}
}
if(left_low <= left_high){
for(i=left_low;i<=left_high;i++)
tmp[k++] = arr[i];
}
if(right_low <= right_high){
for(i=right_low; i<=right_high; i++)
tmp[k++] = arr[i];
}
for(i=0; i<high-low+1; i++)
arr[low+i] = tmp[i];
free(tmp);
return;
}
void merge_sort(int arr[], int left, int right){
int mid = 0;
if(left<right){
mid = (left+right)/2;
merge_sort(arr, left, mid);
merge_sort(arr, mid+1,right);
merge(arr,left,mid,right);
}
return;
}
int distributeCandies(int* candies, int candiesSize) {
int count=1;
merge_sort(candies,0,candiesSize-1);
for(int i=1;i<candiesSize;i++)
if(candies[i]!=candies[i-1])
count++;
return count>(candiesSize/2) ? candiesSize/2 :count;
}
2的代码以后再写,这道题目如果用c++或java或python的话,就很简单,排序只要一个函数就能实现.这让我们更加深刻理解c和c++的区别。