任意の隣接する2つの要素の差の絶対値が1に等しい配列を与え、その配列に要素の値が複数回現れると、最初の位置を返すアルゴリズムを設計する.

1349 ワード

任意の隣接する2つの要素の差の絶対値が1に等しい配列を与え、その配列に要素の値が複数回現れると、最初の位置を返すアルゴリズムを設計する.
例えば,{4,5,6,5,6,7,8,9,10,9}元素9が2回出現し,最初に出現した位置は7である.
アルゴリズムに出会ったら、まず分析して、1、2つの例を挙げて、法則を見てみましょう.
考え方:検索が9、すなわちt=9であり、最初の配列からA[0]=4であれば、t-A[0]=5、第2のステップでt-A[5]=2を計算し、このとき5+2=7である.A[7]は目標数9である.
したがって、この方法は、A[0]から、目標値とA[t]の差に基づいて徐々に決定され、値が見つかるかインデックスが境界を越えるまでtの値を更新し続ける.
このアルゴリズムは,現在位置の数とルックアップ数の差を主に利用して,スパン探索を実現した.アルゴリズムの効率は配列を巡るアルゴリズムよりも高く,容易に実現できる.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] A = { 4, 5, 6, 5, 6, 7, 8, 9, 10, 9 };
            int[] B = { 12, 11, 12, 10, 11, 10, 9, 8, 9, 8 };
            int result = Find(A, 9);
            Console.WriteLine(result);
            result = Find(B, 9);
            Console.WriteLine(result);
            Console.ReadKey();
        }
        static int Find(int[] array, int num)
        {
            int i = 0;
            while (i < array.Length && i >= 0)
            {
                if (array[i] == num)
                {
                    return i;
                }
                i += Math.Abs(num - array[i]);
            }
            return -1;
        }
    }
}