1 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = 2,7,11,15, target = 9
输出:0,1
解释:因为 nums0 + nums1 == 9 ,返回 0, 1 。
示例 2:
输入:nums = 3,2,4, target = 6
输出:1,2
示例 3:
输入:nums = 3,3, target = 6
输出:0,1
暴力法 时间复杂度O(n*n)
利用returnSize作为输出型参数,调用函数完毕后能知道返回数组的大小。
创建新数组接受下标
创建新数组的两种方法
1、使用a2,需要用static修饰才能被main函数接收,否则a数组内存空间将被释放
2、使用malloc函数,
int *a=malloc(sizeof(int)*2)
cs
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
static int a[2]={0};
for(int i=0;i<numsSize-1;i++){
for(int j=i+1;j<numsSize;j++){
if(nums[i]+nums[j]==target){
a[0]=i,a[1]=j;
*returnSize=2;
return a;
}
}
}
*returnSize=0;
return NULL;
}
cs
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
for(int i=0;i<numsSize-1;i++){
for(int j=i+1;j<numsSize;j++){
if(nums[i]+nums[j]==target){
int *a=malloc(sizeof(int)*2);
a[0]=i,a[1]=j;
*returnSize=2;
return a;
}
}
}
*returnSize=0;
return NULL;
}
14 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = "flower","flow","flight"
输出:"fl"
示例 2:
输入:strs = "dog","racecar","car"
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strsi.length <= 200
解题思路:对于二维字符数组,strsSize是数组的行数,strs0表示第一个字符串
从左到右遍历每一列,再从上到下遍历每一行
设当前遍历到j列,i行
如果j=行的长度,说明该行已经遍历完了,没有可遍历的元素, s0j置空,返回s0
如果后面的列与s0的列不相同,s0j置空,返回s0
cs
char* longestCommonPrefix(char** strs, int strsSize) {
char* s0=strs[0];//存放第一个字符串
for(int j=0;s0[j];j++){
for(int i=0;i<strsSize;i++){
if(j==strs[i]||strs[i][j]!=s0[j]){
s0[j]='\0';
return s0;
}
}
}
return s0;
}
15 三数之和
给你一个整数数组 nums ,判断是否存在三元组 nums\[i, numsj, numsk] 满足 i != j、i != k 且 j != k ,同时还满足 numsi + numsj + numsk == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = -1,0,1,2,-1,-4
输出:\[-1,-1,2,-1,0,1]
解释:
nums0 + nums1 + nums2 = (-1) + 0 + 1 = 0 。
nums1 + nums2 + nums4 = 0 + 1 + (-1) = 0 。
nums0 + nums3 + nums4 = (-1) + 2 + (-1) = 0 。
不同的三元组是 -1,0,1 和 -1,-1,2 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = 0,1,1
输出:\[\]
解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = 0,0,0
输出:\[0,0,0]
解释:唯一可能的三元组和为 0 。
解题思路: 排序+双指针
二维数组内存的分配与使用
malloc申请二维数组的方法
int ** ar=(int**)malloc(sizeof(int*)*row*col)
每次要申请三个地址空间
ret\*returnSize=(int*)malloc(sizeof(int) * 3);
malloc申请一维数组的方法
int * ar=(int*)malloc(sizeof(int)*size)
返回列数为3(还是记住这种写法吧)
(*returnColumnSizes)\*returnSize=3;
解释
int** returnColumnSizes 返回数组中每一行的列数
int* returnSize返回数组长度
cs
int cmp(const void *a,const void *b){
return *(int*)a-*(int*)b;
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
*returnSize=0;
if(nums==NULL||numsSize<3)return NULL;
qsort(nums,numsSize,sizeof(int),cmp);
//分配返回数组和返回数组的列数
int** ret=(int**)malloc(sizeof(int*)*numsSize*numsSize);
*returnColumnSizes=(int*)malloc(sizeof(int)*numsSize*numsSize);
for(int i=0;i<numsSize-2;i++){
if(nums[i]>0)break;
第一位去重
if(i>0&&nums[i]==nums[i-1])continue;
int j=i+1,k=numsSize-1;
while(j<k){
int sum=nums[i]+nums[j]+nums[k];
if(sum==0){
ret[*returnSize]=(int*)malloc(sizeof(int) * 3);
//返回列数为3
(*returnColumnSizes)[*returnSize]=3;
ret[*returnSize][0]=nums[i];
ret[*returnSize][1]=nums[j];
ret[*returnSize][2]=nums[k];
//返回行数+1
(*returnSize)++;
int num1=nums[j],num2=nums[k];
//去重
while(j<k&&nums[j]==num1)j++;
while(j<k&&nums[k]==num2)k--;
}else if(sum<0){
j++;
}else{
k--;
}
}
}
return ret;
}