3.数组中的重复数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
思路一 哈希表(过)
思路二原地交换
遍历数组通过交换操作,使元素的索引与值一一对应。因而,就能通过索引映射对应的值,起到与字典等价的作用
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i=0;
while(i<nums.size())
{
if(nums[i] == i)
{
i++;
continue;
}
if(nums[nums[i]]==nums[i])
return nums[i];
swap(nums[i], nums[nums[i]]);
}
return -1;
}
}
二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
思路
从二维数组的右上角或者左下角查找,如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.size() == 0 || matrix[0].size() == 0) return false;
int row = 0;
int col = matrix[0].size()-1;
while(row<matrix.size()&&col>=0)
{
int num = matrix[row][col];
if(num == target)
{
return true;
}
else if(num >target)
{
col--;
}
else
row++;
}
return false;
}
};