剑指Offer_WEEK01
剑指 Offer 03. 数组中重复的数字
思路:将数组进行排序,这样数组是一个有序的序列,然后判断两个相邻的数是否相等,是则返回相同的数
时间复杂度:O(nlogn)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
int res = 0;
for(int i = 0;i < nums.size();i++){
if(nums[i] == nums[i + 1]){
res = i;
break;
}
}
return nums[res];
}
};
思路:
- 扫描整个数组
- 判断下标i是否等于v[i]
- 如果相等,则扫描下一个数
- 否则判断v[i]是否与v[v[i]]相等
- 如果相等,返回v[i]
- 如果不相等,就交换它们
时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int len = nums.size(),ans;
for(int i = 0;i < len;i++){
if(i == nums[i]){
continue;
}else{
if(nums[i] == nums[nums[i]]){
ans = nums[i];
break;
}else{
swap(nums[i],nums[nums[i]]);
}
}
}
return ans;
}
};
剑指 Offer 04. 二维数组中的查找
暴力解法O(nm):
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if (matrix.size() == 0 || matrix[0].size() == 0){
return false;
}
for(int i = 0;i < matrix.size();i++)
for(int j = 0;j < matrix[0].size();j++){
if(target == matrix[i][j])
return true;
}
return false;
}
};
剑指 Offer 05. 替换空格
class Solution {
public String replaceSpace(String s) {
int len = s.length();
StringBuffer sb = new StringBuffer();
for(int i = 0;i < len;i++){
if(s.charAt(i) == ' '){
sb.append("%20");
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
剑指 Offer 06. 从尾到头打印链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> v,x;
while(head){
v.push_back(head->val);
head = head->next;
}
for(int i = v.size() - 1;i >= 0;i--){
x.push_back(v[i]);
}
return x;
}
};
剑指 Offer 07. 重建二叉树
待补充
剑指 Offer 09. 用两个栈实现队列
待补充
剑指 Offer 10- I. 斐波那契数列
class Solution {
public:
int fib(int n){
const int N = 1e9 + 7;
int a = 0,b = 1,c;
if(n == 0 || n == 1)
return n;
for(int i = 1;i < n;i++){
c = (a + b) % N;
a = b;
b = c;
}
return c;
}
};
剑指 Offer 10- II. 青蛙跳台阶问题
class Solution {
public:
const int N = 1e9 + 7;
int numWays(int n) {
int a = 1,b = 2,c;
if(n == 0 || n == 1)
return 1;
if(n == 2)
return 2;
for(int i = 1;i < n - 1;i++){
c = (a + b) % N;
a = b;
b = c;
}
return c;
}
};
剑指 Offer 11. 旋转数组的最小数字
class Solution {
public:
int minArray(vector<int>& numbers) {
sort(numbers.begin(),numbers.end());
return numbers[0];
}
};
剑指 Offer 12. 矩阵中的路径
待补充

浙公网安备 33010602011771号