关于数据结构:改进for循环时间复杂度的一种办法

找到n个数中两个数之和为7的对数

//(相比两层for循环工夫复杂度仅为O(N)的改良算法) 
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<cstdio>
#include<queue>
#include<stack> 
#include<set>
#include<map> 
#include<vector> 
using namespace std;
int main(){
    int n;//要输出n个数来找和为7的数的数对 
    scanf("%d",&n);
    long long num[20];//定义一个数组去存%7取余后余数为i的个数,20是随便定的,>=7就行,因为任何数对7取余都小于7 
    for(int i = 0; i < 20; i++){
        num[i] = 0;//初始化一下,%7余数为i的个数都是0 
    }
    for(int i = 1; i <= n; i++){
        int x;//输出n个数 
        scanf("%d",&x);
        num[x%7]++;//记录余数为某个数i的个数,更新对应的num[i]的值来记录 
    } 
    long long sum = 0;
    sum += (num[0] *(num[0] - 1)/2);//对7取余为0的比拟非凡(因为14+14,7+7等满足条件但却不是一对数(应为不等的一对数))
    //故满足条件的数是7,14,21等排列组合失去的个数为n*(n-1)/2 
    sum += (num[1] * num[6]);//对7取余为1的个数与对7取余为6的个数相乘失去 1和6 总对数(对7取余为1的数与对7取余为6的数相加必定是7的倍数) 
    sum += (num[2] * num[5]);//同理 
    sum += (num[3] * num[4]);//同理
    printf("%lld\n",sum); 
    return 0;
} 

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理