核心思想洗牌算法(Knuth shuffle算法):对于有n个元素的数组来说,为了保证洗牌的公平性,应该要能够等概率的洗出n!种结果。 举例解释如下:开始数组中有五个元素; 在前五个数中随机选一个数与第五个数进行交换,每个数都有五分之一的概率被交换到最后一个位置; 在前四个数中随机选一个数与第四个数进行交换,每个数都有五分之一的概率被交换到第四个位置;
核心思想核心思想为对拼消耗。首先我们考虑最基本的摩尔投票问题,比如找出一组数字序列中出现次数大于总数12\frac{1}{2}21的数字并且假设这个数字一定存在)应用要求达到线性的时间复杂度以及常量级的空间复杂度,直接上摩尔投票法。如果至多选一个代表,那他的票数至少要超过一半(⌊ 1/2 ⌋)的票数;如果至多选两个代表,那他们的票数至少要超过 ⌊ 1/3 ⌋ 的票数;如果至多选m个代表,那他们的票数至少要超过 ⌊ 1/(m+1) ⌋ 的票数。易错点对于m等于2的情况当且
题目链接 1.两数之和 思路分析 可以暴力枚举时间复杂度为O(n2)O(n^2)O(n2),也可以用哈希表把时间复杂度控制在O(n)O(n)O(n) class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> hash; //建立一个无序的哈希表 for(int i = 0; i
题目链接92. 反转链表 II思路分析可以用到206. 反转链表的反转思路/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(
题目链接1603. 设计停车系统class ParkingSystem {public: vector<int> tot; ParkingSystem(int big, int medium, int small) { tot = {big, medium, small}; } bool addCar(int carType) { carType--; if(tot[carType] >= 1)
题目链接206. 反转链表思路分析在这里插入代码片
题目链接54. 螺旋矩阵蛇形矩阵的思路class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { int m = matrix.size(), n = matrix[0].size(); int q[m][n]; memset(q,0,sizeof(q)); int x = 0, y
题目链接7. 整数反转注意题目已经更改为不允许存储 64 位整数(有符号或无符号)。class Solution {public: int reverse(int x) { int total = 0; while(x){ if(total > 0 && total > (INT_MAX - x % 10) / 10) return 0; if(total < 0 &
题目链接728. 自除数数据范围小,暴力枚举就可以。class Solution {public: bool check(int x){ int n = x; while(n){ int t = n % 10; if(t == 0 || x % t != 0) return false; n /= 10; } return true; }
题目链接150. 逆波兰表达式求值注意题目已经更改为不允许存储 64 位整数(有符号或无符号)。class Solution {public: int evalRPN(vector<string>& tokens) { int stk[tokens.size()], tt = 0; if(tokens.size() == 1) return stoi(tokens[0]); for(auto &t : token
题目链接73. 矩阵置零用第一行与第一列来记录对应行是否有0用两个变量来记录第一行和第一列是否有0class Solution {public: void setZeroes(vector<vector<int>>& matrix) { std::ios::sync_with_stdio(false); if(matrix.empty()) return ; int n = matrix.size(), m
题目链接82. 删除排序链表中的重复元素 II设置虚拟头结点dummy不用考虑边界情况,p指针指向的是上一个没有重复的元素的位置,初始位置是dummy,q从p->next开始,一直走到第一个与q->next不同元素的位置,删除中间的即可。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(
题目链接61. 旋转链表一共用两个指针,第一个记录链表的尾节点,第一次遍历记录链表的长度,由于k可能很大所有我们对k模上n,第二次遍历记录我们用第二个指针记录要翻转的第二段链表的前一个节点,然后用尾部指针tail的next指针指向头结点,头结点等于第二个指针的next指针,第二个指针的next指针指向NULL。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode
题目链接74. 搜索二维矩阵与剑指 Offer 04. 二维数组中的查找一样class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { std::ios::sync_with_stdio(false); if(matrix.empty()) return false; int i = 0, j = m
题目链接34. 在排序数组中查找元素的第一个和最后一个位置与剑指 Offer 53 - I. 在排序数组中查找数字 I一样(仅返回值不同)class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { std::ios::sync_with_stdio(false); if(nums.empty()) return {-1, -
题目链接154. 寻找旋转排序数组中的最小值 II思路分析与剑指 Offer 11. 旋转数组的最小数字一样。class Solution {public: int findMin(vector<int>& nums) { std::ios::sync_with_stdio(false); int l = 0, r = nums.size() - 1; while(r > 0 && nums[r]
题目链接1006. 笨阶乘class Solution {public: int clumsy(int N) { std::ios::sync_with_stdio(false); if(N <= 4){ int res[] = {0, 1, 2, 6, 7}; return res[N]; }else{ int res[] = {1, 2, 2, -1};
题目链接42. 接雨水思路分析与程序员面试金典 面试题 17.21. 直方图的水量相同。class Solution {public: int trap(vector<int>& height) { std::ios::sync_with_stdio(false); if(height.empty()) return 0; int n = height.size(); vector<int>
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号