LeetCode 求和类算法题目 详解(C++)
来源:互联网 发布:sql 2张表合并 编辑:程序博客网 时间:2024/05/29 08:17
(乐乐独家研制C++解决方法详解,包含class详解以及后期main调用)
1. two sum(这里就截取官网上的算法题目--乐乐实在懒得打了)
15. three sum
两道题一起讲解~~嘻嘻
这道题目要求用的框架以及乐乐的答案:
#include<iostream>using namespace std;#include<vector> #include<algorithm>class Solution { public: int temp=0 ;public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> result; if(nums.size()>=2) { for(int i=0;i<nums.size()-1;i++) { for(int j=i+1;j<nums.size();j++) { if(nums[i]+nums[j]==target) { result.push_back(i+1); result.push_back(j+1); return result; } } } cout<<"meiyou "<<endl; return result; } } vector<vector<int> > threeSum(vector<int>& nums) { vector<vector<int> > result(4); for(int i=0;i<4;i++) { result[i].resize(3); } int temp=0; for(int i=0;i<nums.size()-2;i++) { for(int j=i+1;j<nums.size()-1;j++) { for(int k=j+1;k<nums.size();k++) { if(nums[i]+nums[j]+nums[k]==0) { result[this->temp][0]=nums[i]; result[this->temp][1]=nums[j]; result[this->temp][2]=nums[k]; //result[this->temp].push_back(nums[i]); //result[this->temp].push_back(nums[j]); //result[this->temp].push_back(nums[k]); this->temp++; } } } } return result; } vector<vector<int> > threeSum2(vector<int> &num) { vector<vector<int> > result; int i,j,k,n= num.size(); sort(num.begin(),num.begin()+n); for(i=0;i<n-2;i++) { if(i>0&&num[i]==num[i-1]) continue; j=i+1; k=n-1; while(j<k) { if(num[i]+num[j]+num[k]<0) { j++; } else if(num[i]+num[j]+num[k]>0) { k--; } else { vector <int> temp; temp.push_back(num[i]); temp.push_back(num[j]); temp.push_back(num[k]); result.push_back(temp); while(j<k&&num[k]==num[k-1]) { k--; } while(j<k&&num[j]==num[j+1]) { j++; } k--; j++; } } } return result; }};int main(){ /* vector<int> v1; vector<int> result; v1.push_back(12); v1.push_back(2); v1.push_back(15); v1.push_back(7); for(int i=0;i<v1.size();i++) { cout<<v1[i]<<" "; } cout<<endl; int target=9; Solution s; result=s.twoSum(v1,target); for(int i=0;i<result.size();i++) { cout<<result[i]<<" "; } */ vector<int> v3; vector <vector<int> >result3; v3.push_back(-1); v3.push_back(0); v3.push_back(1); v3.push_back(2); v3.push_back(-1); v3.push_back(-4); Solution s3; result3=s3.threeSum2(v3); for(int i=0;i<result3.size();i++) { for(int j=0;j<result3[i].size();j++) { cout<<result3[i][j]<<" "; } cout<<endl; }}
讲解
1. 第一题相对简单,主要是考察算法应用,我一开始想到的就是双循环,虽然不是最优解 O(n*n),但是可以实现功能的,一下就巩固一下C++vector 的用法。
(1)首先,引用C++类库:#include<vector>
(2) int &a=b 表示传引用 说白了就是将地址传给变量。→这就不难理解:vector <int> &num 这就相当于新定义一个只想num数组(int num[n];)的首地址的vector类型数据。当然 大家肯定知道vector相当于动态数组,比原本数组拥有更多的灵活性,以及易操作性。
(3)二维数组:vector <int *>num 这个我也没实践过,只是在网上知道这个知识点。以后用空试验一下下。
(4)关于vector的常用函数。如果大家还想知道更多的可以自己百度一下下,我也是这么学习的呢~~
(4.1)num.push_back(20135606)→相当于在数组最后面添加int 20135606(p.s.这是乐乐的学号啦,不要喷我~~)
(4.2)my_num=num.push_pop();后面不加东西哈,表示弹出最后面的元素.
(4.3) num.size(); 数目。
(4.4)这是乐乐自己发现的问题哈,在使用devC++ 编译的时候发现num[3]只能用于获取 不能用于赋值:For instance: int LX=num[3]; 正确 However: num[4]=23;报错 我也不知道是怎么回事,以后再问问大神吧~~
(5)迭代器 是一种检查容器内元素 以及 遍历元素的工具。不能使用下标访问。(后期需要深入了解)
(6)下面进入代码逻辑,哈哈,这个有点简单,就是双重循环,再加上if判断语句就好了~~
2.leetcode15题 三个数字加起来等于0
(1)由于题目框架给的是vector二维数组,那我们就了解一下这个吧:
定义:vector<vector <int> > num(m) 注意我打出来的夸张的空格,所以你一定不要忘记呀。然后就是m。他表示的是一行有多少元素。
可以写一个for循环处理每行 每列的大小:A[i].resize(10);每行10个。
(2)二维矩阵可以这样赋值:A[0][0]=1; however: A[0].push_back(208);会报错 因为只能单步push_back: A.push_back(1);
(3)class类内有成员属性 temp ,后面类内函数调用temp的时候用 this->temp;(重要 请记住)
(4)逻辑逻辑逻辑 重要的事情说三遍:
(4.1)我第一种想法(当然是错误想法)--三重循环,每次判断是否有三个数满足条件,但是这样会有很多重复的结果~~为了避免这样的事情发生,我们需要进行筛选。
(4.2)首先讲一下我算法的原理:
1. 从小到大的排序:用sort(num.begin(),num.begin()+n); 后面两个参数主要是开始 和结束的范围值,在网上没有找到解释的非常清楚的博客,所以乐乐觉得有几个排序数后面的n就加几个,第一个是开始的最小的数值。
2.设定三个标签 I, j, k。i就不用我多说 从第一个到最后一个遍历,内层是J,K一个从前向后,一个从后向前,因为已经排序好,所以如果三个数值大于零,说明K太大了,k--;同理,如果小于零,J++;
3. 注意重复的结果,在处理过程中,只需要将I,j,k都用一个while语句判断就可以了~~
这么看起来其实中级难度的也就这样,如果你喜欢我的文章麻烦点赞转发呦~~乐乐谢谢您~~嘻嘻!!!
以上均为原创作品,如果喜欢请您转发,盗版必究~~~
- LeetCode 求和类算法题目 详解(C++)
- leetcode求和题目
- leetcode部分题目(C++)
- c算法-阶乘求和
- leetcode题目之两数求和
- LeetCode算法题目:Permutations
- LeetCode算法题目:Combinations
- leetcode 算法复习题目
- [leetcode]Path Sum (分支求和 C语言)
- c算法-分数数列求和
- [leetcode]求和类问题
- 算法 - 求和为n的连续正整数序列(C++)
- 判断素数并求和用平方根算法(C语言)
- c算法题目一
- c编程题目详解
- 组合求和(C++)
- LeetCode算法题目:3Sum
- LeetCode算法题目:Gas Station
- 07_04 使用存储过程获取指定课程数
- 最小年龄的三个职工(结构体三级排序)
- 【MSP是什么】MSP的九个治理主题
- elasticsearch的config配置elasticsearch.yml和logging.yml
- java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC 问题
- LeetCode 求和类算法题目 详解(C++)
- 各种排序算法
- spring @responseBody
- 不混淆内部接口
- IDEA中的project和module
- Eclipse配置copyright插入版权信息的详细教程
- 07_05 插入新课程的记录
- SAR图像变化检测的评价指标
- 网址管理