以下是 LeetCode 3266 的 C 语言实现核心思路与 Java 版一致先用最小堆模拟直到堆顶超过最大值再批量分配剩余操作。c#include stdlib.h#include string.h#define MOD 1000000007// 堆元素结构体存储数值和原索引typedef struct {long long val;int idx;} Element;// 最小堆的比较函数int cmp(const void* a, const void* b) {Element* ea (Element*)a;Element* eb (Element*)b;if (ea-val ! eb-val) {return ea-val eb-val ? 1 : -1;}return ea-idx - eb-idx;}// 快速幂long long fastPow(long long x, int n) {long long res 1;while (n 0) {if (n 1) {res (res * x) % MOD;}x (x * x) % MOD;n 1;}return res;}// 最小堆操作上浮void heapUp(Element* heap, int pos) {while (pos 0) {int parent (pos - 1) / 2;if (heap[parent].val heap[pos].val ||(heap[parent].val heap[pos].val heap[parent].idx heap[pos].idx)) {break;}Element tmp heap[parent];heap[parent] heap[pos];heap[pos] tmp;pos parent;}}// 最小堆操作下沉void heapDown(Element* heap, int size, int pos) {while (1) {int left pos * 2 1;int right pos * 2 2;int smallest pos;if (left size (heap[left].val heap[smallest].val ||(heap[left].val heap[smallest].val heap[left].idx heap[smallest].idx))) {smallest left;}if (right size (heap[right].val heap[smallest].val ||(heap[right].val heap[smallest].val heap[right].idx heap[smallest].idx))) {smallest right;}if (smallest pos) break;Element tmp heap[pos];heap[pos] heap[smallest];heap[smallest] tmp;pos smallest;}}// 堆弹出Element heapPop(Element* heap, int* size) {Element top heap[0];heap[0] heap[(*size) - 1];(*size)--;heapDown(heap, *size, 0);return top;}// 堆插入void heapPush(Element* heap, int* size, Element e) {heap[*size] e;(*size);heapUp(heap, *size - 1);}int* getFinalState(int* nums, int numsSize, int k, int multiplier, int* returnSize) {*returnSize numsSize;int* result (int*)malloc(numsSize * sizeof(int));// multiplier 1 时直接返回原数组if (multiplier 1) {memcpy(result, nums, numsSize * sizeof(int));return result;}// 构建最小堆Element* heap (Element*)malloc(numsSize * sizeof(Element));int heapSize 0;int maxVal 0;for (int i 0; i numsSize; i) {Element e {nums[i], i};heapPush(heap, heapSize, e);if (nums[i] maxVal) maxVal nums[i];}// 阶段1模拟直到堆顶 maxVal 或 k 用完while (k 0 heap[0].val maxVal) {Element top heapPop(heap, heapSize);top.val * multiplier;heapPush(heap, heapSize, top);k--;}// 将堆中元素取出排序Element* arr (Element*)malloc(numsSize * sizeof(Element));for (int i 0; i numsSize; i) {arr[i] heapPop(heap, heapSize);}// 按值排序值相同按索引qsort(arr, numsSize, sizeof(Element), cmp);// 阶段2批量分配int base k / numsSize;int extra k % numsSize;for (int i 0; i numsSize; i) {long long val arr[i].val % MOD;int exp base (i extra ? 1 : 0);result[arr[i].idx] (int)(val * fastPow(multiplier, exp) % MOD);}free(heap);free(arr);return result;}复杂度分析· 时间复杂度O(n log n)n 为数组长度· 建堆 O(n)· 模拟阶段最多 O(n) 次堆操作· 排序 O(n log n)· 空间复杂度O(n)关键点说明1. C 语言堆实现手动实现了最小堆的上浮/下沉操作因为 C 标准库没有优先队列2. 避免溢出使用 long long 存储中间乘法的结果3. 快速幂用二进制分解指数O(log k) 计算 multiplier^exp % MOD4. 边界条件当 multiplier 1 时直接返回原数组避免死循环示例验证cint main() {int nums[] {2, 1, 3, 5, 6};int returnSize;int* result getFinalState(nums, 5, 5, 2, returnSize);// 输出: [8, 4, 6, 5, 6]return 0;}这个 C 语言版本保持了与 Java 版相同的优化策略可以高效处理 k 高达 10^9 的大规模输入。