有这样一个数组A,大小为n,相邻元素差的绝对值都是1。

有这样一个数组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]),再重复上述步骤即可。这种算法主要利用了当前位置的数与查找数的差来实现跨越式搜索。算法效率要比遍历数组的算法要高一些,并且易于实现。

int FindNumberInArray(int arr[], int n , int find_number)  
{  
  int next_arrive_index = abs(find_number - arr[0]);  
  while (next_arrive_index < n)  
  {  
    if (arr[next_arrive_index] == find_number)  
      return next_arrive_index;  
    next_arrive_index += abs(find_number - arr[next_arrive_index]);  
  }  
  return -1;  
}

拓展:有一个int型数组,每两个相邻的数之间的差值不是1就是-1.现在给定一个数,要求查找这个数在数组中的位置。

时间: 2025-01-02 14:15:34

有这样一个数组A,大小为n,相邻元素差的绝对值都是1。的相关文章

相邻元素差的绝对值都是1,在这样的数组中找目标元素

有这样一个数组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]),再重复上述步骤即可.这种算法主要

17、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. eg: 输入 3 4 5 1 2 输出 1 思路:用二分法查找最小元素 三种情况: (1)rotateArray[mid] >rotateArray[high]: like:[x,x,x,6,x,x,2],此时最小数字一

从一个数组中随机取出一定数量元素组成新数组

/** * 从一个数组中随机取出一定数量元素组成新数组 * @param array 一个String类型的数组 * @param number需要取出元素的数量 * @return 一个随机的数组 * @throws NullPointerException原数组不能为空 *@throws ArrayIndexOutOfBoundsException新数组长度应不大于原数组的长度 */ public static String[]  getRandomArray(String[] array,

18 如何从一个数组中移除重复的元素

两种方法 (1) 使用LINQ (2) 使用List static void RemoveDups(string[] myStringArray) { // LINQ string[] str = myStringArray.Distinct().ToArray(); // Array to List to Array List<String> myStringList = new List<string>(); foreach (string s in myStringArray

typedef std::string AddressLines[4]定义了一个string数组,大小为4

int main() { typedef std::string AddressLines[4]; std::string *pal = new std::string[4]; std::string *pal1 = new AddressLines; delete [] pal; delete [] pal1; return 0; } typedef std::string AddressLines[4]; 这样定义居然是代表AddressLines是一个string数组,4个string.

C# 判断一个数组是否包含某个给定的元素

string[] elements = new string[50];             if ( Array.IndexOf<string>( elements, "sss" ) != -1 )             {                 //存在                 //返回的值就是 "sss" 在数组中的下标             }             else             {         

随机生成一个数组,然后依次以 当前元素:当前元素之前的元素 格式输出

int main(void) { int m[9] = { 0 }; srand(time(0)); for (int i = 0; i < 9; i++) { m[i] = rand() % 9 + 1; } printf("your array are :\n"); for (int i = 0; i < 9; i++) { printf("%d ",m[i]); } printf("\n"); for (int i = 0; i

18 怎样从一个数组中移除反复的元素

两种方法 (1) 使用LINQ (2) 使用List static void RemoveDups(string[] myStringArray) { // LINQ string[] str = myStringArray.Distinct().ToArray(); // Array to List to Array List<String> myStringList = new List<string>(); foreach (string s in myStringArray

数组中两个元素差的绝对值最小

#include <stdio.h> #include <stdlib.h> /* 给定一个含有n个元素的整型数组, 找出数组中的两个元素x和y使得abs(x - y)值最小 */ /* 思路: 排序, 然后遍历数组比较相邻值相减得到的值 */ typedef struct{ int num1; int num2; }TwoNumber; TwoNumber getTNumber(int* numbers, int length); int cmp(const void *a,co