核心:while(start < end)!!!
1. 判断子序列
我的思路
快慢指针!
新颖的点:用哪个字符串先到达了末尾来判断是否是其子序列。
我的算法
bool isSubsequence(char* s, char* t) {
int pos1 = 0, pos2 = 0;
while(s[pos1] != 0 && t[pos2] != 0){
if(s[pos1] == t[pos2]){
pos1++; pos2++;
}
else{
pos2++;
}
}
if(s[pos1] == 0){
return 1;
}else{
return 0;
}
}
2. 盛最多水的容器
我的思路
宏定义函数不能够函数嵌套!!!
这道题主要是分析,从两边开始移动,要是让装水最多肯定是移动短的那边,移动长的那边不可能有提升,还会下降,因为间隔在下降,移动短边还有一线生机。
同时有保存最好记录的思想在里面,如果有更好的情况再更新,我称之为骑驴找马法。
我的算法
#define min(a,b) a>b?b:a
#define max(a,b) a>b?a:b
int maxArea(int* height, int heightSize) {
int maxwater = 0;
int shorter = 0;
int start = 0, end = heightSize-1;
while(start < end){
shorter = min(height[start],height[end]);
maxwater = max(maxwater,(end-start)*shorter);
if(height[start] < height[end]){
start++;
}
else{
end--;
}
}
return maxwater;
}
3. 两数之和 II - 输入有序数组
我的思路
相遇问题!
这种递增的数列可以试试用双指针放两头,往中间走逼近结果。
我的算法
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
int start = 0, end = numbersSize-1;
int sum;
*returnSize = 2;
int*ans = malloc(sizeof(int)**returnSize);
while(start < end){
sum = numbers[start] + numbers[end];
if(sum > target){
end--;
}
else if(sum < target){
start++;
}
else{
ans[0] = start+1;
ans[1] = end+1;
break;
}
}
return ans;
}