目录
📁 JZ53 数字在升序数组中出现的次数编辑
📁 JZ4 二维数组中的查找编辑
📁 JZ11 旋转数组的最小数字
📁 JZ38 字符串的排列编辑
📁 JZ53 数字在升序数组中出现的次数
这就是一道简单的模板题,使用二分查找的模板往上套即可。如果对二分还不是很熟悉的,可以看一下我写的这一篇文章,讲解的还是比较基础简单的:【算法杂货铺】二分算法_二分朴素-CSDN博客
#include <limits>
class Solution {
public:int GetNumberOfK(vector<int>& nums, int k) {if(nums.size() == 0)return 0;int left = 0, right = nums.size() - 1;int begin = -1 , end = -1;while(left < right){int mid = (left + right) >> 1;if(nums[mid] < k)left = mid + 1;elseright = mid;}if(nums[left] == k)begin = left;if(begin == -1)return 0;left = 0, right = nums.size() - 1;while(left < right){int mid = (left + right + 1) >> 1;if(nums[mid] > k)right = mid - 1;elseleft = mid;}if(nums[left] == k)end = left;return end - begin + 1;}
};
📁 JZ4 二维数组中的查找
根据这个二维数组的性质,搜索目标数。
"每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。"
我们从左上角开始,面临如下几种情况:
1. target == 当前位置:直接返回true.
2. target > 当前位置:说明比当前行中的所有元素都要大,直接去下一行查找.
3. target < 当前位置:说明当前行可能存在目标元素,去前面的位置查找。因为列是从小到大向下递增的,如果当前行没有,要去下一行查找( target > 当前位置),在下一行中可以直接从当前行的列位置开始。
行和列必须在指定范围内。
class Solution {
public:bool Find(int target, vector<vector<int> >& array) {int m = array.size(), n = array[0].size();if(m == 0 || n == 0)return false;int row = 0, col = n - 1;while(row < m && col >= 0){if(array[row][col] == target)return true;else if(array[row][col] > target)col--;else++row;}return false;}
};
📁 JZ11 旋转数组的最小数字
旋转数组后,无非就下面这几种情况:
将一个有序的数组分成一个或两个有序的数组。
1. mid > right:说明最小节点一定在mid的右侧.
2. mid == right: 不确定,逐渐缩小右边界范围.
3. mid < right: 最小节点一定在mid的左侧.
class Solution {
public:int minNumberInRotateArray(vector<int>& nums) {int l = 0, r = nums.size() - 1;while(l < r){int mid = (l + r) >> 1;if(nums[mid] > nums[r])l = mid + 1;else if(nums[mid] == nums[r])--r;elser = mid;}return nums[l];}
};
📁 JZ38 字符串的排列
思路就是:将一个字符串str,生成其所有可能的排列(全排列),并返回去重后的结果。
#include <unordered_map>
#include <vector>
class Solution {
public:vector<string> ret;string path;unordered_set<string> s;vector<string> Permutation(string str) {int n = str.size();vector<bool> arr(n + 1 , false);dfs(str, arr);return ret;}void dfs(string str, vector<bool>& arr){if(path.size() == str.size() && s.find(path) == s.end()){ret.push_back(path);s.insert(path);return ;}for(int i = 0 ; i < str.size(); ++i){if(arr[i] == false){arr[i] = true;path += str[i];dfs(str, arr);arr[i] = false;path.pop_back();}}}
};