鱼C论坛

 找回密码
 立即注册
查看: 3569|回复: 4

搜索旋转排序数列

[复制链接]
发表于 2022-10-11 17:41:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int search(int* nums, int numsSize, int target){
    int i,j;
    int lens=0;
    int * result=(int *)malloc(sizeof(int)*numsSize);
    for(i=0;nums[i]!='\0';i++)
    {
        lens++;
    }

    if(target>lens)
    return -1;//不存在这个目标值

    for(i=target,j=0;i<numsSize-1;i++,j++)
    {
        result[j]=nums[i];
    }
    for(i=0,j=(numsSize-target);i<target;i++)
    {
        result[j]=nums;
    }
    return result[target];


}哪里出现了问题
[/i][/i]
11.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-11 21:21:14 | 显示全部楼层
看来语文不好,才看明白什么意思,就是把本来有序的数组在某处被旋转了,让你以最小的复杂度来判断在否存在,存在给出下标
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-12 11:40:54 | 显示全部楼层
本帖最后由 jhq999 于 2022-10-12 11:54 编辑
  1. #include<stdio.h>

  2. int search(int num[],int n,int target)
  3. {
  4.     int i=0,j=n-1,k=0;
  5.     while(num[i]>num[j])
  6.     {
  7.         k=(i+j)/2;
  8.         if(num[k]>num[i])i=k;
  9.         else j=k;

  10.     }////先折半查找出最大,也就是分界线

  11.     if(target>=num[0])i=0,j=k;
  12.     else if(target<=num[n-1])i=k+1,j=n-1;////判断target在那个段里

  13.     while(i<j-1)//////////再在这个段里折半查找
  14.     {
  15.         k=(i+j)/2;
  16.         if(target>num[k])i=k;
  17.         else j=k;

  18.     }
  19.     if(target==num[i])return i;
  20.     else if(target==num[j])return j;
  21.     return -1;
  22. }
  23. int main()
  24. {
  25.     int num[]={3,4,5,6,7,9,16,0,1};
  26.     printf("%d",search(num,9,16));
  27.     return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-12 13:18:58 From FishC Mobile | 显示全部楼层
  1. #include <stdio.h>

  2. int foo(int nums[], int size, int target) {
  3.         if (target < nums[0]) {
  4.                 for (int i = size - 1; ; --i) {
  5.                         if (nums[i] == target) {
  6.                                 return i;
  7.                         }
  8.                         if (nums[i] < nums[i - 1]) {
  9.                                 break;
  10.                         }
  11.                 }
  12.         }
  13.         else {
  14.                 for (int i = 0; ; ++i) {
  15.                         if (nums[i] == target) {
  16.                                 return i;
  17.                         }
  18.                         if (nums[i] > nums[i + 1]) {
  19.                                 break;
  20.                         }
  21.                 }
  22.         }
  23.         return -1;
  24. }

  25. int main(void) {
  26.         int nums[] = { 4, 5, 6, 7, 0, 1, 2};
  27.         printf("%d", foo(nums, 7, 0));

  28.         return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-14 22:05:53 | 显示全部楼层
这道题全部时间复杂度下限是o(n)

两种做法:
1、
o(n)读数据
o(n* log2 n)快排 或 o(n)基数排序
o(log2 n)二分查找

2.
o(n)读数据
o(n)直接查找
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-16 19:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表