文章目录
文章目录
今日知识总结
-
定义一维数组方式
int a[7];//只是开辟出了空间 int a[7] = {0, 1, 2, 3, 4, 5, 6}//不仅开辟了空间,还将元素储存到了空间里 int a[] = {0, 1, 2, 3, 4, 5, 6}//如果初始化列表里已经知道有多少个元素,那么括号中的数字可以省略 int a[28] = {0, 1, 2, 3, 4, 5, 6}//我们也可以定义一个大数组,值初始化其中的几个元素
-
长度和容量:长度不允许超过容量
-
数组的索引:从零开始,所以数组的最大下标是数组的长度减一
-
数组的参数传参
int add(int[] nums){ } //力扣上也会写成如下形式 int add(int* nums){ }
题目分析
-
33. 搜索旋转排序数组
-
题目链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
-
思路:
- 直接比遍历一便数组,如果能找到等于目标的值,就返回他的下标,这样做的时间复杂度为o(n),不满足题目要求
- 题目说明是有序数组,那么,把数组旋转可能只有几种关系,可以考虑用二分查找来进行查询,此时的时间复杂度为O(logn)
-
代码:
-
思路一代码:
class Solution { public: int search(vector<int>& nums, int target) { for(int i = 0; i < nums.size(); i++){ if(nums[i] == target) return i; } return -1; } };
-
思路二代码:
-
-
-
81. 搜索旋转排序数组 II
-
题目链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/
-
思路:遍历一遍数组
-
代码:
class Solution { public: bool search(vector<int>& nums, int target) { for(int i = 0; i < nums.size(); i++){ if(nums[i] == target) return true; } return false; } };
-
-
153. 寻找旋转排序数组中的最小值
-
题目链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
-
思路:二分查找,具体思路链接参照:https://blog.csdn.net/songyaxuanwoai/article/details/123833818?spm=1001.2014.3001.5502
-
代码:
class Solution { public: int findMin(vector<int>& nums) { int left, right, mid; left = 0, right = nums.size() - 1, mid = 0; while(left < right){ mid = (right - left) / 2 + left; if(nums[right] < nums[mid]) { left = mid + 1; } else if(nums[right] > nums[mid]){ right = mid; } } return nums[left]; } };
-
-
70. 爬楼梯
-
题目链接:https://leetcode-cn.com/problems/climbing-stairs/
-
思路:动态规划
- 定义一个数组f[46],来记录到达最顶层台阶的方法数,由题意可得,到达第0层,和到达第一层只有一种方法,那么到达第n层的方法数只取决于到达第n -1层的方法数以及到达第n - 2层的方法数,可以得到状态转移方程为 f [ n ] = f [ n − 1 ] + f [ n − 2 ] f[n] = f[n -1] + f[ n -2] f[n]=f[n−1]+f[n−2]
3.代码:
class Solution { public: int climbStairs(int n) { int f[46] = {1, 1}; for(int i = 2; i <= n; i++){ f[i] = f[i - 1] + f[i - 2]; } return f[n]; } };
-
-
509. 斐波那契数
-
题目链接:https://leetcode-cn.com/problems/fibonacci-number/
-
思路:动态规划
-
代码:
class Solution { public: int fib(int n) { int f[n + 1]; if(n == 0) f[0] = 0; else{ f[0] = 0; f[1] = 1; } for(int i = 2; i < n + 1; i++){ f[i] = f[i - 1] + f[i - 2]; } // for(int i = 0; i < n + 1; i++){ // cout<<"f[" << i << "]=" << f[i] << endl; // } return f[n]; } };
-
-
1137. 第 N 个泰波那契数
-
题目链接:https://leetcode-cn.com/problems/n-th-tribonacci-number/
-
思路:根据题目中数学公式进行运算
-
代码:
class Solution { public: int tribonacci(int n) { int f[38] = {0, 1, 1}; for(int i = 3; i <= n; i++){ f[i] = f[i - 3] + f[i - 1] + f[i - 2]; } return f[n]; } };
-
-
2006. 差的绝对值为 K 的数对数目
-
题目链接:https://leetcode-cn.com/problems/count-number-of-pairs-with-absolute-difference-k/
-
思路:
- 第一个循环用来判断找数组的第一个数,第二个循环找符合条件的第二个数,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
- 使用哈希表,从最后一个开始遍历,如果哈希表里有这个数,这个数对应的值就加一,如果没有这个数,就把这个数加进哈希表,从哈希表里找与他差为k的数,如果找到了,
cnt += m[mid]
,找不到就进行继续往下进行
-
代码:
思路一代码:
class Solution { public: int countKDifference(vector<int>& nums, int k) { int cnt = 0; for(int i = 0; i < nums.size() ; i++){ for(int j = i + 1; j < nums.size(); j++){ int mid = nums[i] - nums[j]; if(mid < 0) mid *= -1; if(mid == k) cnt++; } } return cnt; } };
-
思路二代码
class Solution { public: int countKDifference(vector<int>& nums, int k) { unordered_map<int,int> m; int cnt = 0; for(int i = nums.size() - 1; i >= 0 ; i--){ m[nums[i]]++; int mid1 = nums[i] - k; int mid2 = nums[i] + k; if(mid1 > 0 && m.find(mid1) != m.end()) cnt += m[mid1]; if(m.find(mid2) != m.end()) cnt += m[mid2]; } return cnt; } };
-
-
-
LCP 01. 猜数字
-
题目链接:https://leetcode-cn.com/problems/guess-numbers/
-
思路:就枚举判断就行
-
代码:
class Solution { public: int game(vector<int>& guess, vector<int>& answer) { int cnt = 0; for(int i = 0; i < 3; i++){ if(guess[i] == answer[i]){ cnt++; } } return cnt; } };
-
-
LCP 06. 拿硬币
-
题目链接:https://leetcode-cn.com/problems/na-ying-bi/
-
思路:只需要判断这一堆币的个数是否是2的倍数,如果不是,就加一强行把他变成2的倍数
-
代码:
class Solution { public: int minCount(vector<int>& coins) { int cnt = 0; for(int i = 0; i < coins.size(); i++){ if(coins[i] % 2 == 1) coins[i] += 1; cnt += (coins[i] / 2); } return cnt; } };
-
-
剑指 Offer II 069. 山峰数组的顶部
-
题目链接:https://leetcode-cn.com/problems/B1IidL/
-
思路:找到最大的数字就行
-
代码:
class Solution { public: int peakIndexInMountainArray(vector<int>& arr) { int max = 0; int index = -1; for(int i = 0; i < arr.size(); i++){ if(arr[i] > max) { max = arr[i]; index = i; } if(arr[i] < max) break; } return index; } };
-
今日收获
- 一维数组的运用
今日疑问:
- 二分查找的细节问题
资料链接
- https://blog.csdn.net/songyaxuanwoai/article/details/123833818?spm=1001.2014.3001.5502