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;
}