最后一块石头的重量
Last Stone Weight
解
降序排序,每次 选取最重的。应该算是贪心吧。(话说中文的为啥没有样例233)
由于C语言没有sort函数,所以这里用的是并归排序
void Merge(int a[], int left, int mid, int right)
{
int len = right - left + 1;//数组长度
int temp[len];
int k = 0;
int i = left;//前一数组起始
int j = mid + 1;//后一数组起始
while(i <= mid && j <= right){
temp[k++] = a[i] > a[j] ? a[i++] : a[j++];
//将最大的存入数组
}
while(i <= mid){
temp[k++] = a[i++];
}
while(j <= right){
temp[k++] = a[j++];
}
for (k = 0; k < len; k++){
a[left++] = temp[k];
}
}
void MergeSort(int a[], int left, int right)
{
if (left == right){
return;
}
int mid = (left + right) / 2;
MergeSort(a, left, mid);
MergeSort(a, mid + 1, right);
Merge(a, left, mid, right);
}
int lastStoneWeight(int *stones, int stonesSize)
{
while (stonesSize > 1){
MergeSort(stones, 0, stonesSize - 1);
if (stones[1] == 0){
break;
}
stones[0] -= stones[1];
stones[1] = 0;
}
return stones[0];
}
结果
C语言虽然没有sort函数,但我们可以使用qsort函数
int comp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
int lastStoneWeight(int *stones, int stonesSize)
{
while (stonesSize > 1){
//MergeSort(stones, 0, stonesSize - 1);
qsort(stones, stonesSize, sizeof(stones[0]), comp);
if (stones[1] == 0){
break;
}
stones[0] -= stones[1];
stones[1] = 0;
}
return stones[0];
}
结果