給定n個元素的整數數列,求出子段和最大的子段。
#include <stdio.h> int max_sub_sum(int a[],int left, int right,int *left_partion,int *right_partion){ int center,i,j,sum,left_sum,right_sum,s1,s2,lefts,rights; if(left == right){ /*二分法遞歸結束條件*/ if(a[left] > 0){ return a[left]; *left_partion = left; *right_partion = left; }else { return 0; } }else{ center = (left + right)/2; left_sum = max_sub_sum(a, left,center,left_partion,right_partion); /*求左邊最大子段*/ right_sum = max_sub_sum(a, center + 1, right,left_partion,right_partion);/*求右邊最大子段*/ /*下面求中間交叉部分最大子段*/ s1 = 0; lefts = 0; for(i=center; i>=left;i--){ lefts = lefts + a[i]; if(lefts > s1){ s1 = lefts; *left_partion = i; } } s2 =0; rights = 0; for(j = center + 1; j<=right;j++){ rights = rights + a[j]; if(rights > s2){ s2 = rights; *right_partion = j; } } /*選擇最大子段*/ if((s1 + s2 < left_sum) && (right_sum < left_sum))return left_sum; if(s1 + s2 < right_sum)return right_sum; return s1+s2; } } int main(){ int a[] = {-2,1,-4,13,-5,6}; int left_partion = -1; /*左邊界*/ int right_partion = -1;/*右邊界*/ int i =0; int ret = max_sub_sum(a,1,5,&left_partion,&right_partion); printf("max_sub_sum is:%d,left_partion=%d,right_partion=%d/n",ret,left_partion,right_partion); printf("the partion is:["); for(i=left_partion; i <=right_partion; i++){ printf("%d",a[i]); if( i != right_partion){ printf(","); } } printf("]"); getch(); return 0; }
動畫算法一 https://visualgo.net/en 動畫算法二 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 動畫算法三 http://www
一、排序算法導圖 二.算法實現 冒泡排序 1.算法簡介: 冒泡排序是所有排序算法中最簡單、最基本的一種。冒泡排序法的思路就是交換排序,通過相鄰數據的交換來達到排序的目的。 2.排序流程: 對數組的各個數據,依次比較相鄰的元素的大小; 如
代碼:queue.h#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define Status bool#define ERROR 0#define OVERFLOW -2#def
一: 假設按照升序排序的數組在預先未知的某個點上進行了旋轉。 ( 例如,數組 [0,1,2,4,5,6,7] 可能變爲 [4,5,6,7,0,1,2] )。 搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回 -1
輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。 這道題最簡單的思路莫過於把輸入的n個整數排序,排序之後位於最前面的k個數就是最小的k個數。這種思路的時間複雜度是O(
判斷一個數是否爲2的n次方。 #include <iostream> using namespace std; bool is2N(int dest) { if (dest & (dest - 1)) //核心代碼 retu
對於一個字符串類型的表達式,實現基礎的加減乘除運算 String expression = "8/2+2*5-4"; 使用棧來實現這個表達式的解析和運算 實現思路: 1,通過一個index來遍歷我們的表達式 2,如果發現是一個數字,判斷
想了解更多數據結構以及算法題,可以關注微信公衆號“數據結構和算法”,每天一題爲你精彩解答。也可以掃描下面的二維碼關注 八皇后的來源 八皇后問題是一個以國際象棋爲背景的問題:如何能夠在8×8的國際象棋棋盤上放置八個皇后,使得任何一
</pre><p><pre name="code" class="java">/* * 散列表 */ public class HashTable { public static final int CAPACITY = 10;
線索二叉樹: 按照某種方式對二叉樹進行遍歷,可以把二叉樹中所有結點排序爲一個線性序列,在該序列中,除第一個結點外每個結點有且僅有一個直接前驅結點;除最後一個結點外每一個結點有且僅有一個直接後繼結點; 在有N個節點的二叉樹中需要利用N+
什麼是堆:堆是一種經過排序的完全二叉樹,其中任一非終端節點的數據值均不大於(或不小於)其左孩子和右孩子節點的值; 首先,堆分爲大根堆(最大堆)和小根堆(最小堆)二種; 小根堆滿足:
寫在前面: 博主是一名軟件工程系大數據應用開發專業大二的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和自己的暱稱。作爲一名互聯網小白,寫博客一方面是爲了記錄自己的學習歷程,一方面是希望能夠幫助到很多和自己一樣處於起步階段的
1.剪繩子(7.1) 題目描述 給你一根長度爲n的繩子,請把繩子剪成整數長的m段(m、n都是整數,n>1並且m>1,m<=n),每段繩子的長度記爲k[1],…,k[m]。請問k[1]x…xk[m]可能的最大乘積是多少?例如,當繩子
一、遞歸 1.藉助棧,實現3種遍歷的非遞歸算法。 2.層次遍歷是自頂向下、自左至右的遍歷二叉樹中的元素,可以藉助隊列實現。 二、具體實現 #include<stdio.h> #include<stdlib.
數組去重 function unique(arr) { const seen=new Map(); return arr.filter((a) => !seen.has(a)&& seen.set(a,1)); }