2022.6.3
题目描述:
给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
我的题解:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void swap(int *a,int *b){
int tmp=*a;
*a=*b;
*b=tmp;
}
void bubblesort(int nums[],int numsSize){
for(int i=numsSize;i>1;--i){
int swapped=0;//标记
for(int j=1;j<i;j++){
if(nums[j-1]>nums[j]){
swap(&nums[j-1],&nums[j]);
swapped=1;
}
}
if(!swapped){
break;
}
}
}
int* sortedSquares(int* nums, int numsSize, int* returnSize){
//建立一个表放入
int* tmp=(int*)malloc(sizeof(int)*numsSize);
memset(tmp,0,sizeof(int)*numsSize);
//依次放入
for(int i=0;i<numsSize;++i){
int changeNum=nums[i]*nums[i];
memcpy(&tmp[i],&changeNum,sizeof(int));
}
//先排个序
bubblesort(tmp,numsSize);
*returnSize=numsSize;
return tmp;
}
我的思路:
手写冒泡+依次放入
蛮搞的
速度就特别感人了hhh
题目描述:
给你一个整数数组
nums
,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。请你返回排序后的数组。
我的题解:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* frequencySort(int* nums, int numsSize, int* returnSize){
//哈希
int*hash=(int*)malloc(sizeof(int)*201);
memset(hash,0,sizeof(int)*201);
//如果是负数+100进行映射
for(int i=0;i<numsSize;++i){
int tmp=nums[i];
hash[tmp+100]++;
}
int len=numsSize;
int min=10000;//记录出现最小次数的次数
int k=0;//记录最小小标也就是数
int*hash2=(int*)malloc(sizeof(int)*len);
memset(hash2,0,sizeof(int)*len);
for(int i=0;i<201;++i){
//找出次数最小
if(hash[i]>0&&min>hash[i]){
min=hash[i];//找到出现次数最小的数啦
}
}
int max=1;//记录出现最多次的次数
for(int i=0;i<201;++i){
if(max>0&&max<hash[i]){
max=hash[i];//找到出现次数最多的数啦
}
}
// printf("%d",max);
// printf("\n");
// printf("%d",min);
int h=0;
//最大最小都求出来了就开始遍历
for(int i=min;i<=max;i++){
for(int j=200;j>=0;--j){
if(hash[j]==i){
int count=i;
int hunhe=h+count;
while(h<hunhe){
if(h>=numsSize)
break;
hash2[h]=j-100;
// printf("%d",j);
h++;
}
}
}
}
*returnSize=numsSize;
return hash2;
}
我的思路:
哈希排序+三重循环
究极暴力(写了两小时md)
懒得解释了以后也不想看了。。
题目描述:
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
请你找到并返回这个整数
我的题解:
int findSpecialInteger(int* arr, int arrSize){
int* tmp=(int*)malloc(sizeof(int)*100001);
memset(tmp,0,sizeof(int)*100001);
for(int i=0;i<arrSize;++i){
tmp[arr[i]]++;
}
int max=0;
int index=0;
for(int j=0;j<100001;++j ){
if(tmp[j]>0&&max<tmp[j]){
max=tmp[j];
index=j;
}
}
return index;
}
我的思路:
哈希排序直接拿下