1. 724. 寻找数组的中心下标
前缀和求法
int pivotIndex(int* nums, int numsSize) {
int total = 0;//求所有元素总和
for (int i = 0; i < numsSize; i++)
{
total += nums[i];
}
int sum = 0;//求前缀和
for (int i = 0; i < numsSize; i++)
{
if (total - nums[i] == 2 * sum)
{
return i;
}
sum += nums[i];
}
return -1;
}
2. 169. 多数元素
2.1 排序法
如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 n-1/2
的元素(下标从 0 开始)一定是众数。
int cmp(int* a, int* b)
{
return *a - *b;
}
int majorityElement(int* nums, int numsSize){
qsort(nums, numsSize, sizeof(nums[0]), cmp);
return nums[(numsSize - 1) / 2];
}
2.2 分类哈希
int majorityElement(int* nums, int numsSize){
int hash[50000],hasher[50000],i;
memset(hash,0,sizeof(hash));
memset(hasher,0,sizeof(hasher));
for(i=0;i<numsSize;i++)
{
if(nums[i]>-1)
{
++hash[nums[i]];
if (hash[nums[i]]>numsSize/2)
return nums[i];
}
else
{
++hasher[-nums[i]];
if (hash[-nums[i]]>numsSize/2)
return -nums[i];
}
}
return 0;
}
2.3 摩尔投票法
摩尔投票法两个步骤
1. 投票阶段:投票人之间票数进行抵消
2. 计数阶段:计算对抗结果最后剩下的那个候选人的票数是否有效
int majorityElement(int* nums, int numsSize)
{
int len=numsSize;
int major=nums[0];//遍历第一个元素,候选人是2
int count=0;
for(int i=0;i<len;i++){
//如果数组中还有2的话我们的count就++;
if(nums[i]==major){
count++;
}else{
//如果没有就减1
count--;
}
//如果count=0的时候就更换候选人
if(count==0){
//更换候选人
major=nums[i];//重新赋值major
//票数重置为1
count=1;
}
}
return major;
}
3. HJ10 字符个数统计
类哈希思想
#include <stdio.h>
#include <string.h>
int main() {
char c=0;
int a=0;
char hash[128]={0};
int ret=0;
while(scanf("%c",&c) != EOF)
{
a=(int)c;
if(hash[a] == 0 && a!= 10)
{
ret++;
}
hash[a]=1;
}
printf("%d\n",ret);
return 0;
}