C++面试题(43)------数组中数值和下标相等的元素

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

给定一个整数数组 nums,返回所有满足 nums[i] == i 的元素的值。如果没有这样的元素,则返回一个指定的值(比如 -1 或者空列表)。

解法一:对于无序数组(暴力搜索)

对于无序数组,最直接的方法就是遍历整个数组,检查每一个元素是否满足 nums[i] == i 的条件

代码:


#include 
using namespace std;

vector< int > findMatchIndices( vector< int >& nums )
{
    vector< int > result;
    for ( int i = 0; i < nums.size(); ++i )
    {
        if ( nums[ i ] == i )
        {
            result.push_back( nums[ i ] );
        }
    }
    return result;
}

int main()
{
    vector< int > nums = { 0, 1, 3, 5, 6, 7 };
    vector< int > result = findMatchIndices( nums );
    for ( int num : result )
    {
        cout << num << " ";
    }
    cout << endl;
    return 0;
}

运行结果:

0 1 

解法二:对于递增排序数组(二分查找)

如果数组是递增排序的,并且我们知道数组中的数字都在 0 ~ n-1 范围内,可以利用二分查找来优化搜索过程。这是因为在一个递增排序的数组中,一旦找到一个满足条件的位置,它的左侧不可能再有满足条件的元素(因为左边的值应该更小),而右侧可能还有满足条件的元素。
代码:


#include 
#include 
using namespace std;
#include 
using namespace std;

int findMagicIndex( vector< int >& nums )
{
    int left = 0, right = nums.size() - 1;
    while ( left <= right )
    {
        int mid = left + ( right - left ) / 2;
        if ( nums[ mid ] == mid )
        {
            return mid;  // 找到匹配
        }
        else if ( nums[ mid ] > mid )
        {
            right = mid - 1;  // 在左半部分查找
        }
        else
        {
            left = mid + 1;  // 在右半部分查找
        }
    }
    return -1;  // 没有找到匹配
}

int main()
{
    vector< int > nums   = { 1, 2, 2, 5, 6, 7 };
    int result = findMagicIndex( nums );
  
    cout << result << " ";
    
    cout << endl;
    return 0;
}

运行结果:

2

你可能感兴趣的:(c++,c++,算法,数据结构)