class Solution { public: long long maxKelements(int* nums, int numsSize, int k) {//定义一个求最大k个数的函数 long long ans;//对nums数组进行排序,从大到小,qsort会根据cmp返回值排序 qsort(nums, numsSize, sizeof(nums[0]), cmp);//使用数组中的最大数字初始化ans ans = (long long)nums[0];//更改数组值 nums[0] = (int)ceil((double)nums[0] / 3.0);//将第一个元素除以3并向上取整 int pos = 1 % numsSize;//pos指针指向第二个元素 for (int i = 1; i < k; i++) { if (nums[pos] >= nums[0]) {//如果pos指向的元素大于第一个元素 ans += (long long)nums[pos];//将pos指向的元素加入ans nums[pos] = (int)ceil((double)nums[pos] / 3.0);//更改pos指向的值 pos = (pos + 1) % numsSize;//pos指针后移 } else { //如果pos指向的元素小于第一个元素 qsort(nums, numsSize, sizeof(nums[0]), cmp);//重新排序,从大到小 ans += (long long)nums[0];//最大元素加入ans nums[0] = (int)ceil((double)nums[0] / 3.0); //将除以3并向上取整后的第一个元素更新为数组中的第一个元素 pos = 1 % numsSize;// 重置pos指针 } } return ans; } };算法中核心成员函数的运行原理或流程
时间: 2024-03-04 07:49:55 浏览: 44
C/C++ 通过最大堆求topk
这是一个求最大k个数的算法,核心成员函数为maxKelements。该函数接受三个参数:一个整型数组nums、数组长度numsSize和k,返回一个long long类型的最大k个数之和。
函数中首先对nums数组进行从大到小的排序,然后使用数组中的最大数字初始化ans。接着将第一个元素除以3并向上取整,更新数组中的第一个元素。然后定义一个指针pos指向第二个元素。
接下来进入一个for循环,循环k次。在循环中,先判断pos指向的元素是否大于等于第一个元素,如果是,则将pos指向的元素加入ans,然后将pos指向的元素除以3并向上取整,更新数组中的pos指向的元素。pos指针后移一位。
如果pos指向的元素小于第一个元素,则重新对数组进行排序,从大到小。再将第一个元素除以3并向上取整,更新数组中的第一个元素。重置pos指针为1 % numsSize。
循环结束后,返回ans即可。
阅读全文