前言
太可恶了,我刚学完C++那些基础理论,像泛型编程,类,然后再没什么刷题经验的情况下,来了Leetcode,我就说这咋实现,感觉头都大了,怎么写怎么不对,然后一看发现,数据外部传入,我只需要补充类函数实现就行了,像int main()这些根本不用写,我只需要写个处理方法就行,气死我了!!!
学算法,刷力扣(leetcode)不知道怎么刷?来看看,我把刷题网站上线了!最强刷题攻略!_哔哩哔哩_bilibili
代码随想录
二分
第704题
704. 二分查找 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: int search(vector<int>& nums, int target) { int left=0; int right=nums.size()-1; int mid; while(left<=right) { mid=left+(right-left)/2; if(nums[mid]==target) { return mid; } if(nums[mid]>target) { right=mid-1; } if(nums[mid]<target) { left=mid+1; } } return -1; } };
|
第35题
35. 搜索插入位置 - 力扣(LeetCode)
第34题
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
第69题
69. x 的平方根 - 力扣(LeetCode)
第367题
367. 有效的完全平方数 - 力扣(LeetCode)
哈希
第242题
242. 有效的字母异位词 - 力扣(LeetCode)

好家伙,这就速度能比,那个内存分布有点奇怪,提交次数不一样,内存分布大小就不一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: bool isAnagram(string s, string t) { int hash[26]={0}; for(auto i:s) { hash[i-'a']++; } for(auto j:t) { hash[j-'a']--; } for(int n=0;n<26;n++) { if(hash[n]!=0) { return 0; } } return 1; } };
|
第349题
349. 两个数组的交集 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> u1(nums1.begin(),nums1.end()); set<int> u2; for(auto i:nums2) { if(u1.find(i)!=u1.end()) { u2.insert(i); } } vector<int>num; for(auto i:u2) { num.push_back(i); } return num; } };
class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { unordered_set<int> s1; vector<int> vec; vec.reserve(1000); int hash[1005]={0}; for(int i:nums1) { hash[i]=1; } for(int j:nums2) { if(hash[j]==1) { s1.insert(j); } } for(int a:s1) { vec.push_back(a); } return vec; } };
|
第202题
202. 快乐数 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: int Sum(int n) { int m=0; while(n) { m+=(n%10)*(n%10); n=n/10; } return m; } unordered_set<int> s1; bool isHappy(int n) { while(true) { if(n==1) { return true; } s1.insert(n); n=Sum(n); if(s1.find(n)!=s1.end()) { return false; } } } };
|
第1题
1. 两数之和 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { for(int i = 0; i < nums.size(); i++){ for(int j = i + 1; j < nums.size(); j++){ if(nums[i] + nums[j] == target){ return {i,j}; } } } return {0,0}; } };
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,int>mp; for(int i=0;i<nums.size();i++) { auto iter=mp.find(target-nums[i]); if(iter!=mp.end()) { return {iter->second,i}; } mp.insert(pair<int,int>(nums[i],i)); } return {}; } };
|
数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。
std::map 和std::multimap 的key也是有序的有序才用红黑树为底层的,无序直接用哈希表为底层的
map用来做什么
map中key和value分别表示什么
map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)
接下来是map中key和value分别表示什么。
这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。
那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。
所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。
在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。

动态规划
第509题
509. 斐波那契数 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Solution { public: int fib(int n) { if(n==0||n==1) { return n; } return fib(n-1)+fib(n-2); } };
#include<iostream> using namespace std; int dp(int n); int iteration(int n); int main() { int n; while(1) { cout << "输入你想知道的斐波拉契第几项:"; cin >> n; cout << dp(n) <<" --动态规划"<< endl; cout << iteration(n) <<" --迭代"<< endl; } } int dp(int n) { int dp[1000] = { 0,1 }; for (int i = 0; i < n; i++) { dp[i + 2] = dp[i] + dp[i + 1]; } return dp[n]; } int iteration(int n) { if (n == 1 || n == 2) { return 1; } int a = 1, b = 1; for (int i = 0; i < n - 2; i++) { int temp = a + b; a = b; b = temp; } return b; }
|
第70题
70. 爬楼梯 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public: int climbStairs(int n) { if(n==1||n==2) { return n; } return climbStairs(n-1)+climbStairs(n-2); } };
|