普通版 剑指 Offer 浅刷浅刷(11)

< data.length()) {string tempString = "";//存储两个 , 中间的字符while (data[idx] != ',') {tempString += data[idx];++idx;}//若tempstring没有数据,则存入空,反之创建节点并存入if (tempString == "#") {myVector.push_back(nullptr);} else {int num = atoi(tempString.c_str());TreeNode *tempNode = new TreeNode(num);myVector.push_back(tempNode);}++idx;}//连接各个节点int pos = 1;for (int i = 0; i < myVector.size(); i++) {if (myVector[i] == nullptr) {continue;}myVector[i]->left = myVector[pos++];myVector[i]->right = myVector[pos++];}return myVector[0];}};// Your Codec object will be instantiated and called as such:// Codec codec;// codec.deserialize(codec.serialize(root));
这就是二叉树的创建和输出,哎嘘,要人命呢 。
剑指 Offer 38. 字符串的排列
//方法一:class Solution {public:vector> permutation(string s) {vector> myVector;sort(s.begin(), s.end());do {myVector.push_back(s);} while (next_permutation(s.begin() , s.end()));return myVector;}};//next_permutation是求当前排列的下一个排列,(按字典升序的下一个序列),如1234的next_permutation是1243,常用于全排列题目//返回值:如果有下一个序列就返回1,否则返回0//方法二:class Solution {public:vector> permutation(string s) {vector> myVector;dfs(myVector, s, 0);return myVector;}void dfs(vector>& myVector, string &s, int pos) {if (pos == s.size()) {myVector.push_back(s);}for (int i = pos; i < s.size(); i++) {int flag = 1;for (int j = pos; j < i; j++) { //字母相同时,等效,就不用再次交换加入vector了,去重,剪枝if (s[j] == s[i]) {flag = 0;}}if (flag) {swap(s[pos], s[i]);dfs(myVector, s, pos + 1);swap(s[pos], s[i]); //再交换回来}}}};
方法一:使用c++中的函数,直接存储所有序列 。
方法二:标准的深度优先搜索,做一下剪枝就好 。
剑指 Offer 39. 数组中出现次数超过一半的数字
//方法一:class Solution {public:int majorityElement(vector& nums) {map myMap;for (int i = 0; i < nums.size(); i++) {myMap[nums[i]]++;if (myMap[nums[i]] > nums.size() / 2) {return nums[i];}}return 0;}};//方法二:class Solution {public:int majorityElement(vector& nums) {sort(nums.begin(), nums.end());return nums[nums.size() / 2];}};//方法三:class Solution {public:int majorityElement(vector& nums) {int num = nums[0];//记录最有可能的众数int count = 0; //记录抵消后num的数量for (auto i: nums) {if (!count) { //如果抵消后num数量为0,那就表示该数可能不是众数,换下一个数num = i;count++;continue;}if (i == num) {count++;} else {count--;}}return num;}};
方法一:哈希表,没啥说的,不用等遍历完了再判断,直接可以进行判断 。
方法二:排序,因为它的数量大于长度的一半,所以数组中间一定是该数 。
方法三:Boyer-Moore 投票算法 。
剑指 Offer 40. 最小的k个数
//方法一:class Solution {public:vector getLeastNumbers(vector& arr, int k) {sort(arr.begin(), arr.end());vector myVector;while (k) {myVector.push_back(arr[k - 1]);k--;}return myVector;}};//方法二:class Solution {public:vector getLeastNumbers(vector& arr, int k) {vector myVector;if (!k || !arr.size()) {return myVector;}//c++优先队列就是大根堆,即堆顶是最大的元素priority_queue myQueue;//先压入四个元素for (int i = 0; i < k; i++ ) {myQueue.push(arr[i]);}//然后一直比较,打了就剔除,压入新的for (int i = k; i < arr.size(); i++) {if (myQueue.top() > arr[i]) {myQueue.pop();myQueue.push(arr[i]);}}//把最终剩下来的k个数存入数组while (k--) {myVector.push_back(myQueue.top());myQueue.pop();}return myVector;}};//方法三:class Solution {public:vector getLeastNumbers(vector