如何做服装的微商城网站,吉安建设公司网站,怎样在网上做宣传,网络优化工具题目
给定一个大小为 n 的数组 nums #xff0c;返回其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的#xff0c;并且给定的数组总是存在多数元素。
示例 1#xff1a;
输入#xff1a;nums [3,2,3]输出#xff1a;3
…题目
给定一个大小为 n 的数组 nums 返回其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的并且给定的数组总是存在多数元素。
示例 1
输入nums [3,2,3]输出3
示例 2
输入nums [2,2,1,1,1,2,2]输出2
提示
n nums.length1 n 5 * 10^4-10^9 nums[i] 10^9
进阶尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
代码
完整代码
int majorityElement(int* nums, int numsSize) {int most nums[0];int cnt 1;for (int i 1; i numsSize; i) {if (nums[i] most) {cnt;} else {cnt--;if (cnt 0) {most nums[i];cnt 1;}}}return most;
}思路分析
该问题的最优解法是使用Boyer-Moore多数投票算法时间复杂度为 O(n)空间复杂度为 O(1)。这个算法的核心思想是维护一个候选多数元素以及其计数器。当遍历数组时如果当前元素与候选多数元素相同计数器加一如果不同计数器减一。当计数器减为零时将当前元素设为候选多数元素并重置计数器为一。最终剩下的候选多数元素即为数组中的多数元素。
拆解分析
初始化候选元素和计数器
初始化候选多数元素 most 为数组的第一个元素计数器 cnt 为 1。
int most nums[0];
int cnt 1;遍历数组更新候选元素和计数器
遍历数组从第二个元素开始
如果当前元素等于候选多数元素计数器加一否则计数器减一如果计数器减为零更新候选多数元素为当前元素并重置计数器为一。
for (int i 1; i numsSize; i) {if (nums[i] most) {cnt;} else {cnt--;if (cnt 0) {most nums[i];cnt 1;}}
}返回候选多数元素
最终返回候选多数元素 most。
return most;复杂度分析
时间复杂度O(n)其中 n 是数组的长度。我们只需遍历数组一次。空间复杂度O(1)我们只使用了常数级别的额外空间。
结果 一题多解
排序法
排序法思路分析
排序数组后多数元素必定会出现在中间位置。我们可以直接返回排序后的数组中位于 n/2 位置的元素。
排序法复杂度分析
时间复杂度O(n log n)这是qsort的时间复杂度。空间复杂度O(1)如果排序算法是原地排序否则为 O(n)。
完整代码
#include stdio.h
#include stdlib.hint cmp(const void* a, const void* b) {return (*(int*)a - *(int*)b);
}int majorityElement(int* nums, int numsSize) {qsort(nums, numsSize, sizeof(int), cmp);return nums[numsSize / 2];
}拆解分析
排序数组
使用标准库中的 qsort 函数对数组进行排序。
qsort(nums, numsSize, sizeof(int), cmp);返回中间元素
由于多数元素必定会出现在中间位置直接返回排序后数组中 numsSize / 2 位置的元素。
return nums[numsSize / 2];结果