您的位置:首页 > 财经 > 产业 > 免费网站推广优化_家装公司取名字大全集_运营推广怎么做_上海百度分公司电话

免费网站推广优化_家装公司取名字大全集_运营推广怎么做_上海百度分公司电话

2024/10/31 7:19:54 来源:https://blog.csdn.net/m0_75005390/article/details/143140362  浏览:    关键词:免费网站推广优化_家装公司取名字大全集_运营推广怎么做_上海百度分公司电话
免费网站推广优化_家装公司取名字大全集_运营推广怎么做_上海百度分公司电话

1 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 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、使用a[2],需要用static修饰才能被main函数接收,否则a数组内存空间将被释放

2、使用malloc函数,

int *a=malloc(sizeof(int)*2)

​
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;
}​
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 <= strs[i].length <= 200

解题思路:对于二维字符数组,strsSize是数组的行数,strs[0]表示第一个字符串

从左到右遍历每一列,再从上到下遍历每一行

设当前遍历到j列,i行

如果j=行的长度,说明该行已经遍历完了,没有可遍历的元素,s0[j]置空,返回s0

如果后面的列与s0的列不相同,s0[j]置空,返回s0

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], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-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返回数组长度

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com