1.分發餅干?
假設你是一位很棒的家長,想要給你的孩子們一些小餅干。但是,每個孩子最多只能給一塊餅干。
對每個孩子?i
,都有一個胃口值?g[i]
,這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干?j
,都有一個尺寸?s[j]
?。如果?s[j]?>= g[i]
,我們可以將這個餅干?j
?分配給孩子?i
?,這個孩子會得到滿足。你的目標是滿足盡可能多的孩子,并輸出這個最大數值。
中心思路:運用貪心算法思想,每次都取最優解,使得整體趨向最優解,再次體重表現為每? ? ? ? ? ? ? ? ? ? 次分配大于等于胃口最小孩子最小的餅干。
int compare(const void *a,const void *b){return(*(int*)a-*(int*)b); //比較函數,用于排序
}
int findContentChildren(int* g, int gSize, int* s, int sSize) {qsort(g,gSize,sizeof(int),compare);qsort(s,sSize,sizeof(int),compare);int child=0;int cookie=0;while(child<gSize&&cookie<sSize){if(s[cookie]>=g[child]){child++;}cookie++;}return child;
}
?
2.最長回文子串?
給你一個字符串?s
,找到?s
?中最長的?回文?子串。
中心思路:采用動態規劃思想,分解問題,細分情況,用一個二維數組dp[n][n]來表示哪兩個? ? ? ? ? ? ? ? ? ? ?字符相等
char* longestPalindrome(char* s) {int n=strlen(s);if(n<2){return s;}int dp[n][n];memset(dp,0,sizeof(dp)); //初始化dp為0int start=0;int maxlen=1;for(int i=0;i<n;i++){dp[i][i]=1;}for(int i=0;i<n-1;i++){if(s[i]==s[i+1]){dp[i][i+1]=1;maxlen=2;start=i;}}for(int len=3;len<=n;len++){for(int i=0;i<n-len+1;i++){int j=i+len-1;if(s[i]==s[j]&&dp[i+1][j-1]){dp[i][j]=1;maxlen=len;start=i;}}}char* result = (char*)malloc((maxlen + 1) * sizeof(char));strncpy(result, s + start, maxlen); //復制字符串s給result,由s的start開始,長度為 //maxlenresult[maxlen] = '\0'; return result;
}
?
?
?
?