zoukankan      html  css  js  c++  java
  • 7、【常见算法】数组元素查找

      题目:有这样一个数组A,大小为n,相邻元素差的绝对值都是1。如:A={4,5,6,5,6,7,8,9,10,9}。现在,给定A和目标整数t,请找到t在A中的位置。除了依次遍历,还有更好的方法么?

      解法:数组第一个数为array[0], 要找的数为y,设t = abs(y - array[0])。由于每个相邻的数字之差的绝对值为1。故第t个位置之前的数肯定都比y小。因此直接定位到array[t],重新计算t,t = abs(y – array[t]),再重复上述步骤即可。这种算法主要利用了当前位置的数与查找数的差来实现跨越式搜索。算法效率要比遍历数组的算法要高一些,并且易于实现。

     1 //数组元素查找
     2 #include <iostream>
     3 #include <cmath>
     4 
     5 using namespace std;
     6 
     7 typedef int Index;
     8 
     9 int findNum(int *arr, int len, int target)
    10 {
    11     if(!arr || len < 0)
    12         cout << "Invalid Input!" << endl;
    13     Index iter = abs(arr[0] - target);
    14     while(iter < len)
    15     {
    16         if(arr[iter] == target)
    17             return iter;
    18         iter += abs(arr[iter] - target);
    19     }
    20     return -1;
    21 }
    22 
    23 void printArray(int *arr, int len)
    24 {
    25     if(!arr || len < 0)
    26         cout << "Invalid Input" << endl;
    27     for(Index iter = 0; iter < len; iter++)
    28     {
    29         cout << arr[iter] << endl;
    30     }
    31 }
    32 
    33 int main()
    34 {
    35     const int arrMax = 10;
    36     int arr[arrMax] = {4, 5, 6, 5, 6, 7, 8, 9, 10, 9};
    37     printArray(arr, arrMax);
    38 
    39     int target = 7;
    40     cout << target << "在数组中的索引为:";
    41     cout << findNum(arr, arrMax, target) << endl;
    42 
    43     target = 11;
    44     cout << target << "在数组中的索引为:";
    45     cout << findNum(arr, arrMax, target) << endl;
    46 
    47 //    system("pause");
    48     return 0;
    49 }
  • 相关阅读:
    cookie与session的原理及区别
    jwt原则
    Django rest framework基础 RESTful风格
    vue项目使用整理
    Serializer 字段验证以及序列化
    ModelSerializer 字段验证以及序列化
    Django
    FREE 命令结果完全剖析
    一个一元二次方程求解编程引申的两个知识点(abs和fabs的区别以及浮点数比较相等)
    signed和unsigned之二
  • 原文地址:https://www.cnblogs.com/Long-w/p/9796162.html
Copyright © 2011-2022 走看看