剑指OFFER
- 找出数组中重复的数字
思路:设置n个坑,每次检查当前坑的数和当前的坑是否匹配,以及当前以当前坑上的数作为坑里面是否已经有当前坑的数(有点绕人!)
代码:
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int len = nums.size();
for (auto x : nums)
if (x < 0 || x >= len)
return -1;
for (int i = 0; i < len; i++) {
while (i != nums[i] && nums[i] != nums[nums[i]]) {
swap(nums[i],nums[nums[i]]);
}
if (nums[i] != i && nums[i] == nums[nums[i]])
return nums[i];
}
return -1;
}
};
- 不修改数组找出重复的数字
思路一:开辟额外的数组 空间复杂度O(N)
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int len = nums.size();
int arr[len];
for (int i = 0; i < len; i++) {
arr[i] = 0;
}
for (int i = 0; i < len; i++) {
arr[nums[i]]++;
if (arr[nums[i]] > 1) {
return nums[i];
}
}
}
};
思路二:抽屉原理+分治法 空间复杂度O(1);
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
//分治法 + 抽屉原理
int l = 1, r = nums.size() - 1;
while (l < r) {
int mid = (l + r) >> 1;
int cnt = 0;
for (auto x : nums)
cnt += (x >= l && x <= mid);
if (cnt > mid - l + 1) r = mid;
else l = mid + 1;
}
return r;
}
};
- 二维数组中的查找
O(m+n) 线性查找
代码:
class Solution {
public:
bool searchArray(vector<vector<int>> array, int target) {
int len = array.size();
if (array.empty() || array[0].empty()) {
return false;
}
int i = 0, j = len - 1;
while (i < len && j >= 0) {
if (array[i][j] == target) {
return true;
}
if (target > array[i][j]) i++;
else j--;
}
return false;
}
};
- 替换空格
简单的语法题
代码:
class Solution {
public:
bool searchArray(vector<vector<int>> array, int target) {
int len = array.size();
if (array.empty() || array[0].empty()) {
return false;
}
int i = 0, j = len - 1;
while (i < len && j >= 0) {
if (array[i][j] == target) {
return true;
}
if (target > array[i][j]) i++;
else j--;
}
return false;
}
};