![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数组
Shelbyh
这个作者很懒,什么都没留下…
展开
-
【数组4】leetcode46、47 全排列
全排列1:全排列是经典必背题目,主要用回溯的办法,应用used数组来记录元素是否已经被遍历过,直接记录代码即可:class Solution { vector<int> path; vector<vector<int>> re;public: vector<vector<int>> permute(vector<int>& nums) { vector<bool> us原创 2021-05-30 23:03:18 · 112 阅读 · 2 评论 -
【数组3】leetcode34排序数组中第一个和最后一个位置
这道题目也是二分查找的变形,主要是考察使用二分查找来寻找左界和右界。直接使用二分查找对应的解决就可以了,有一个讲的很好的文章可以一看:详解二分查找算法普通正常的二分查找:int left = 0;int right = n - 1;while(left <= right){ int mid = (left + right) / 2; if(nums[mid] == target) { return mid; } else if(n.原创 2021-05-26 21:46:16 · 51 阅读 · 0 评论 -
【数组2】leetcode33 搜索旋转排序数组
在数组的题目中,一旦涉及到数组有序就要考虑二分法的使用。这道题是二分法的变形使用,在题解中看到一个很有趣的思路:因为是旋转数组,因此肯定有一个分界点,这个分界点左边是递减的,右边是递增的,那么在二分遍历时候,可以采用边遍历边有序的策略:(1)更新mid = l + (r - l) / 2,在l <= r的情况下,判断target和num[0]的大小关系(1.1)如果target大于num[0],说明target在分界点的左边。如果此时的num[mid]小于num[0],说明num[mid]在分.原创 2021-05-25 21:00:17 · 101 阅读 · 0 评论 -
【数组1】leetcode31 下一个排列
思路:(1)初始设i = -1。在[0, n-1]范围内从后向前找,找到第1个升序对nums[i],nums[j],里面的nums[i]即为要交换的小数(2)在[j, n-1]范围内从后向前找,找到第1个大于nums[i]的数nums[k],nums[k]即为要交换的大数(3.1)如果i = -1,说明不存在升序对,也就是整体是降序,也就是当前排列为最大,因此翻转整个数组(3.2)如果i != -1,则交换nums[i]和nums[k]的值,然后将j之后的数全部变为升序(这样做保证后面的都是最小的.原创 2021-05-24 21:35:10 · 47 阅读 · 0 评论