给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
提示:
1 <= nums.length <= 105
k
的取值范围是[1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前
k
个高频元素的集合是唯一的
给定一个实例输入
输入:nums=【1,1,2,2,2,3】
解题过程:
1.首先初始化一个二维数组arr【2】【1000】={0},并将arr【0】【0】赋值为nums【0】,arr【1】【0】赋值为1,第一个数为nums中出现的数字,第二个数字为此数字出现的次数。
int arr[2][10000]={0};
arr[0][0]=nums[0];
arr[1][0]=1;
1 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 0 |
再初始化arr的有效长度m=1,标志flag默认为0。
2.从输入数组的第二个元素进行遍历,并将每个元素与arr数组中出现的元素进行比较,如果遇到相同的元素则arr中相应的元素出现次数加一,且标志flag变为1,最后跳出循环。
if(nums[i]==arr[0][j])
{
arr[1][j]++;
flag=1;
break;
}
1 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 | 0 |
如果内层循环结束后flag仍为0,则代表此元素在arr中没有出现过,arr增加相应元素,出现次数变为1,同时arr有效长度m加一。
if(flag==0)
{
arr[0][m]=nums[i];
arr[1][m]++;
m++;
}
1 | 2 | 0 | 0 | 0 | 0 |
2 | 1 | 0 | 0 | 0 | 0 |
如若flag不为0,则将flag重新赋值为0。
3.再遍历完成后,对arr中元素的出现次数按照从大到小的顺序进行排序。
for(i=0;i<m-1;i++)
{
t=i;
for(j=i+1;j<m;j++)
{
if(arr[1][t]<arr[1][j])
t=j;
}
if(t!=i)
{
p=arr[0][t];
arr[0][t]=arr[0][i];
arr[0][i]=p;
p=arr[1][t];
arr[1][t]=arr[1][i];
arr[1][i]=p;
}
}
4.最后返回出现次数前K的元素
for(i=0;i<k;i++)
{
res[i]=arr[0][i];
}
return res;
完整代码如下
int* topKFrequent(int* nums, int numsSize, int k, int* returnSize){
int i,j,t,p,m=1,flag=0;
int arr[2][10000]={0};
int *res=malloc(sizeof(int)*k);
arr[0][0]=nums[0];
arr[1][0]++;
*returnSize=k;
for(i=1;i<numsSize;i++)
{
for(j=0;j<m;j++)
{
if(nums[i]==arr[0][j])
{
arr[1][j]++;
flag=1;
break;
}
}
if(flag==0)
{
arr[0][m]=nums[i];
arr[1][m]++;
m++;
}
else
flag=0;
}
for(i=0;i<m-1;i++)
{
t=i;
for(j=i+1;j<m;j++)
{
if(arr[1][t]<arr[1][j])
t=j;
}
if(t!=i)
{
p=arr[0][t];
arr[0][t]=arr[0][i];
arr[0][i]=p;
p=arr[1][t];
arr[1][t]=arr[1][i];
arr[1][i]=p;
}
}
for(i=0;i<k;i++)
{
res[i]=arr[0][i];
}
return res;
}