646.最长数对链(动态规划) 解题思路:动态规划(最长升序子序列变体)dp[i]表示到索引为i的这个元素为止,有多少个满足要求的数对,即第一个元素大于前一个元素的第二个元素。动态转移方程if(pairs[i][0]>pairs[j][1]){ dp[i]=max(dp[i],dp[j]+1);但是由于给的数组是无序的,因此需要首先对数组作处理。首先数组按照第二个元素的升序排列,而不是按第一个元素的升序排列,原因是前者能够为后面留下更多的空间。sort(pairs.begi..
131.分割回文串 解题思路:使用深度优先搜索,一旦搜索到回文字符串,那么就进入递归,并且递归中从上一次搜索的下一个位置开始搜索。具体见代码。class Solution { vector<vector<string>> ret;public: //判断是否是回文字符串 bool calc(const string& s){ int i=0,j=s.size()-1; while(i<j){ if(s..
384.打乱数组 解题思路:用一个辅助数组vec,大小与传入数组一样,并且元素是生成的随机数。使得vec按照升序排序,并且原始数组也按照其排序方法排序。通过这种方式来随机打乱数组。举个例子:nums [2,3,1] vec [10,6,30]那么vec按升序排序就是vec[0]和vec[1]交换,那么nums[0]和nums[1]也交换。所以nums [3,2,1] vec [6,10,30]具体代码如下class Solution { vector<int> m_nums;..
934.最短的桥(广度优先搜索) 解题思路方法1:暴力法使用深度优先搜索,讲两个岛屿的坐标存储到两个数组中,然后用两个for遍历数组,找到最小置。很暴力,时间和空间复杂度也很高。class Solution {public: int shortestBridge(vector<vector<int>>& grid) { int m=grid.size(),n=grid[0].size(); vector<vector<bool>>vi.
51.N皇后(回溯法) 解题思路:回溯法主函数初始化一个全为’.'的二维数组,哪个位置可以放置皇后棋子,修改为’Q’即可。axis数组用来存放已经放置棋子的坐标。 //主函数 vector<vector<string>> solveNQueens(int n) { vector<vector<string>>ans; vector<string>board(n,string(n,'.')); ve..
417.太平洋大西洋水流问题 解题思路:一开始自己的思路是看每一个点是否能流到太平洋和大西洋,很复杂,各种细节考虑不到。看了题解觉得这个方法很好,记录一下。我们从四个边开始往高处走,能走到的位置就是能流到对应边旁边的洋流。can_reach_p,(太平洋 pacific)代表能到达太平洋;can_reach_a,(大西洋 atlantic)代表能到达大西洋。假如某个点的can_reach_p和can_reach_a都为true,说明符合条件。具体思路看代码。class Solution {public: vec.
240.搜索二维矩阵II 解题思路看到两个关键词,有序+寻找目标值,很自然的想到二分查找。当二维数组中的某一行首元素<=target,并且尾元素>=target 时,那么target可能在这一行。因此,首先寻找所有可能有target的行,保存在数组中。接下来对这些行,进行二分查找,找到就返回true,没找到就对下一个符合条件的行进行二分查找。假如最后都没有找到target,那就是matrix二维数组中不存在target,返回false。class Solution {public: bool b_.
81.搜索旋转排序数组II(数组旋转后二分查找) 记录一下:if(nums[left]==nums[mid]){ //无法判断哪个区间是升序的 ++left; }假如是上面这种情况,反正是寻找有无target,两个元素相等,直接让left往右移动一个,直到能够判断左边还是右边是升序!class Solution {public: bool search(vector<int>& nums, int target) { .
524.通过删除字母匹配到字典里最长单词 思路:因为要找长度最长且字母序最小的字符串。因此先对dictionary进行排序,按字符串长度降序,假如长度相同就按字母序,即默认的string排序即可。接下来遍历dictionary每一个string元素,记为dic,看是否满足要求。辅助函数,判断dic是否是s的子串:假如dic长度大于s,那么必然不可能由s删除字符得到dic,返回false;否则就用双指针的方法,判断即可,具体流程见代码。class Solution {public: bool help(const stri..
665.非递减数列 思路:初始化一个bool类型的变量flag,true表示改动的次数未用,false表示改动的次数用掉了。先看一下前两个元素是否满足非递减要求,不满足flag初始化为false。从nums[1]开始,每次和后面一个元素比较,假如不满足非递减,就选择下面两种情况中的一个改变元素:1 [3,5,4,6] 5>4且4>3,那么要把5变成4;即i=1,nums[i+1]>=nums[i-1]; nums[i]=nums[i+1];2 [5,6,3,7] 6>3且3<5,那..
406.根据身高重建队列 思路:按身高降序排列,假如身高一样就按升序排列。接下来,创建一个数组ret保存结果,遍历people数组;people第二个元素的值就是该people要插入数组ret中的位置,因为身高是按降序排列,而身高相同则按k升序排列,因此一定不会影响到后面的元素,如下图所示。class Solution {public: vector<vector<int>> reconstructQueue(vector<vector<int>>& peo.
453.最小操作数使数组元素相等 关键:让n-1个元素加1,就相当于选一个元素-1;选n-1个元素加1,加到所有元素相等,就相当于选1个元素减1,减到所有的元素都等于最小元素。class Solution {public: int minMoves(vector<int>& nums) { //得到nums中的最小元素 int min_val=INT_MAX; for(auto num:nums) { min_va..
union中有struct的情况-从内存分析 union中的每个成员共用一块内存,且首地址相同;这块内存必须大于等于union中最大成员的字节数。举个例子:union U中有两个成员,一个是int型的a,4个字节;一个是结构体STU,考虑对齐,16个字节。struct STU { int b; long long c;};union U{ int a; STU stu;};首先使用结构体初始化union U,查看其内存分布情况:U u; STU m_stu; m_stu.b = 6; m_stu.c = 66;