文章
46
粉丝
12
获赞
0
访问
3.4k
)算法基本设计思想
i
标记当前连续段的起始位置,j
向后扫描至下一个不同元素,统计当前元素的连续长度 j-i
。n/2
,直接返回该元素;遍历结束无符合条件的元素则返回 -1
。(2)C 语言算法实现(含排序 + 双指针逻辑)
c
// 快速排序(递归实现,使数组有序)
void quickSort(int A[], int low, int high) {
if (low < high) {
int p = partition(A, low, high);
quickSort(A, low, p-1); // 左半段排序
quickSort(A, p+1, high); // 右半段排序
}
}
// 找主元素(排序后双指针遍历)
int findMainItem(int A[], int n) {
quickSort(A, 0, n-1); // 第一步:排序,使相同元素连续
int i = 0;
while (i < n) {
int j = i;
// 扫描连续相同元素的右端点
while (j < n && A[j] == A[i]) {
j++;
}
// 判定:连续长度是否超过 n/2
if (j - i > n / 2) {
return A[i]; // 满足条件,返回主元素
}
i = j; // 跳到下一个不同元素的起始位置
}
return -1; // 无主元素
}
(3)时间复杂度与空间复杂度
时间复杂度:
O(nlogn)
(最坏&n...
登录后发布评论
暂无评论,来抢沙发