(1.2.4.1)数组的相关算法

  • 1-递归实现数组求和
  • 2-一个变量二维数组
  • 3-递归判断数组递增
  • 4-排序数组中查找指定元素重复出现次数
  • 5-无序数组的交集
  • 6-有序数组的交集
  • 7-重复次数最多的元素
  • 8-On时间复杂度中寻找数组中出现一半以上的数
  • 9-求解存放连续数的数组的唯一重复元素时间复杂度On
  • 10-出现奇数次的元素
  • 11-数组中符合条件的数组对个数
  • 12-数组验证有无重复元素
  • 13-使得数组左边全为奇数右边为偶数
  • 14-数组去重
  • 15-求第二大数
  • 16-求最大最小数
  • 17-后M个数移动到前M
  • 18-寻找只出现一次的元素
  • 19-判断一个整数X是否可以表示nn2个连续正整数的和

1-递归实现数组求和

int getsum(int *a,int n)
{
 if(n==0)  return 0;
 else{
 getsum(a,n-1)+a[n-1];
 }
}

2-一个变量二维数组

#define MAXX=2
#define MAXY=3

void print(){
int array[MAXX][MAXY]={1,2,3,4,5,6};
for(int i=0;i<MAXX*MAXY;i++){ printf("d%/n",array[i/MAXX][i%MAXY]);//i/maxx实现外层大循环,i%maxy实现内存小循环 } }

3-递归判断数组递增

int isIncrese(int a[],int n){
if(n==1)
 return 1;
 else 
   return a[n]>a[n-1]&&isIncrease(a,n-1);
}

4-排序数组中查找指定元素重复出现次数

示例:{1,2,2,2,3}数组中2出现3次

  • 解法1. 顺序查找,找到第一个指定元素位置,开始记录i,出现一次i++,到出现不一样元素时,输出i
  • 解法2.二分查找,分别查找该元素出现的第一个位置,在查找出现的最后一个位置,相减求出重复次数

5-无序数组的交集

  • 使用hashset,判断是否重复,或者hashmap
  • 分别转化为有序数组,针对有序数组进行交集分析
  • 位图法
  • 野蛮分析法 每一个元素分别判断,n*m

6-有序数组的交集

  • 两数组的长度基本一致
    • hashmap
    • 遍历一个建立hashset,遍历另一个判断是否冲突
    • 仿照有序链表的合并
  • 两数组的长度悬殊很大
    • 遍历长度小的数组,将得到的元素在长数组中进行二分\分块查找

7-重复次数最多的元素

  • 位图法
  • hashmap

8-O(n)时间复杂度中,寻找数组中出现一半以上的数

  • hashmap
  • 编程之美,水王问题,,,每次取出两个不同的数,剩下元素中水王仍然超过一半。
    • 不断取出不同的的数,剩下的就是水王
    • count变量,是+1,否-1

9-求解存放连续数的数组的唯一重复元素,时间复杂度O(n)

  • 允许辅助空间——位图法
  • 无辅助空间——数组中存放1~n-1: 数组求和-[1,2,,,n-1]的和相减,即为所求元素

10-出现奇数次的元素

  • 位图法
  • 如果只有一个基数次元素:可使用异或法 k^k=0 k^0=k,,对数组内所有元素集体进行异或

11-数组中符合条件的数组对个数

一个整数数组,元素取值为1~n-1,元素不会重复,查找数对个数,满足a+b=n+1
  • 蛮力法 n*m
  • 数组排序+二分查找
    • a[s]+a[end]>n+1; 则end–
    • a[s]+a[end]=n+1 则s++.end–
    • a[s]+a[end]

12-数组验证有无重复元素

  • 位图法
  • 排序+两两比较
  • hashset
  • hashmap

13-使得数组,左边全为奇数,右边为偶数

快速排序的变形

14-数组去重

  • 蛮力法 n*m
  • 快速排序+再遍历去重
  • 下标数组法

15-求第二大数

两个变量,max,secondMAX

16-求最大最小数

  • 两次遍历 比较次数2N
  • 一次遍历,每次取一个,1:2比较,比较次数2N
  • 一次遍历,每次取两,2:2,比较次数1.5n
  • 分治法

17-后M个数移动到前M

类似字符串的移位

18-寻找只出现一次的元素

异或法

19-判断一个整数X是否可以表示n(n>2)个连续正整数的和

X=m+(M+1)+(m+2)+,,,(m+n-1);
X=(2m+n-1)*n/2;

m=(2*x/n-n+1)/2;
问题转化为M是否存在,也就是(2*x/n-n+1)/2是否是偶数

你可能感兴趣的:((1.2.4.1)数组的相关算法)