子數組中的最大乘積

  • 思路一算法

    找出全部N-1個數的組合,分別計算它們的乘積,找出最大的。思路很簡單,時間複雜度爲很高O(N*N)編程

  • 思路二數組

    採起「空間換時間」策略,下降時間複雜度。spa

        數據數組爲a[ ],設置數組s[ ],t[ ]。code

        數組s[ ]的每一個元素s[ i ]記錄數組前i個數的乘積,s[ 0 ]設置爲1class

        數組t[ ]的每一個元素t[ i ]記錄數組後i個數的乘積,t[ 0 ]設置爲1書籍

        數組p[ ]的每一個元素p[ i ]爲前i-1個數和後n-i個數的乘積(即排除第i個數的其餘數的乘積)統計

        計算p[ ]的最大值便可
數據

int calculate(int a[],int n)
{
	int sum=1;
	int * s = (int *)malloc(sizeof(int) * (n));
	int * t = (int *)malloc(sizeof(int) * (n));
	int * p = (int *)malloc(sizeof(int) * (n+1));
	s[0]=t[0]=1;

	int i;
	for(i=1;i<n;i++)
	{
		//s[i]爲計算前i個數的乘積
		s[i]=a[i-1]*s[i-1];
		//t[i]爲計算後i個數的乘積
		t[i]=a[n-i]*t[i-1];
	}

	for(i=1;i<=n;i++)
		//p[i]爲前i-1個數和後n-i個數的乘積(即排除第i個數的其餘數的乘積)
		p[i]=s[i-1]*t[n-i];

	free(s);
	free(t);
	free(p);
	//max(p)求數組p的最大值,這裏不實現
	return max(p);
}

該算法的時間複雜度爲O(n)時間


  • 思路三

    根據數組中0,正數,負數的個數來計算

    zeroCount, pCount, nCount分別表示0,正數,負數的個數。

    1.zeroCount>0 說明最少有一個0,計算除0之外全部數的乘積記作Q,若是Q>0,返回Q,若是Q<0,說明有奇數個負數,因此0爲最大值

    2.nCount(負數的個數)爲奇數個,則排除絕對值最小的負數便可

    3.nCount爲偶數(包含0),排除最小的正整數便可。

統計zeroCount,pCount,nCount的個數以及查找正整數最大值,負整數最大值時間複雜度都爲O(n),因此總體複雜度都爲O(n)


參考書籍:《編程之美》   

相關文章
相關標籤/搜索