【4.2日题解】——查找(c代码表述)

简介: 【4.2日题解】——查找(c代码表述)

今天的题目也不难,算是接触一下基本的算法思路,二分就过了,但是,我们就这么屈服了???那不能。我们要整活。多种解法的冲!!!!!

4.2日每日一题——查找


🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人

✨联系方式:2201891280(QQ)

⏳全文大约阅读时间: 20min


全文目录

☘前言☘

解题思路一

解题思路二

解题思路三

📑写在最后

P2249 【深基13.例1】查找

解题思路一

暴力,直接写,直接冲。


#include <stdio.h>
#include <stdlib.h>
int data[1000005];
int main(){
    int m,n,x;
    scanf("%d %d",&m,&n);
    for(int i = 0;i < m;++i)    scanf("%d",&data[i]);
    for(int i = 0;i < n;++i){
        scanf("%d",&x);
        int j;
        for(j = 0; j < m;++j)
                if(data[j] < x) continue;
                else break;
        if(j < m && data[j] == x) printf("%d ",j+1);
        else printf("-1 ");
    }
    return 0;
}

炸咯!!!!!!!!!!!!!!!!!!!!!!!


解题思路二

二分是不可能二分的,我就不二分。一次性读入所有待查询的数据,然后将待查询的数据排序,之后从前往后扫就行了,时间复杂度就是 l o g ( m ) + n + l o g ( m ) log(m) + n + log(m)log(m)+n+log(m),本质上就是减少了指针的回溯。


#include <stdio.h>
#include <stdlib.h>
int data[1000005];
typedef struct{
        int id,data,ans;
}Search;
Search search[100005];
int cmpdata(const void * a, const void *b){
    return ((Search *)a)->data < ((Search *)b)->data ? -1 : 1;
}
int cmpid(const void * a, const void *b){
    return ((Search *)a)->id < ((Search *)b)->id ? -1 : 1;
}
int main(){
    int m,n;
    scanf("%d %d",&m,&n);
    for(int i = 0;i < m;++i)    scanf("%d",&data[i]);
    for(int i = 0;i < n;i++)    {scanf("%d",&search[i].data);search[i].id = i;}
    qsort(search, n, sizeof(Search), cmpdata);
    for(int i = 0,j =0 ;j < n;++j){
        while(i < m && data[i] < search[j].data)  ++i;
        if(i < m && data[i] == search[j].data)    search[j].ans = i+1;
        else    search[j].ans = -1;
    }
    qsort(search, n ,sizeof(Search),cmpid);
    for(int i = 0;i < n;++i)
        printf("%d ", search[i].ans);
    return 0;
}


Ohhhhhhhhhhhhhhhhhh~~~~~~~~~过啦


解题思路三

读一个查一个,但是查找的过程使用二分查找。


#include <stdio.h>
#include <stdlib.h>
int data[1000005];
int search(int x, int l, int r){
        while(l < r){
                int mid = l + (r -l)/2;
                if(data[mid] >= x) r = mid;
                else l = mid + 1;
        }
        if(data[l] == x) return l + 1;
        return -1;
}
int main(){
    int m,n,x;
    scanf("%d %d",&m,&n);
    for(int i = 0;i < m;++i)    scanf("%d",&data[i]);
    for(int i = 0;i < n;++i){
        scanf("%d",&x);
        printf("%d ",search(x,0,m - 1));
    }
    return 0;
}


OHhhhhhhhhh~~也过啦


📑写在最后

其实我也尝试了将后两种方式融合一下,但是效果并不好,大家可以多思考一些解决方法,其实很多时候如果查询数据量高于数据量本身。可能方法二就会更好。大家一起加油呀0.0

其实我第二种解法错了十几次,原因是忘了本身的次序,哎,还是太菜了,要好好学习呀


相关文章
|
存储 C语言
C语言题目的多种解法分享 2之字符串左旋和补充题
C语言题目的多种解法分享 2之字符串左旋和补充题
75 0
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
45 1
|
6月前
|
自然语言处理 算法 编译器
编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
156 0
(C语言版)力扣(LeetCode)27.移除元素三种解法分析
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
|
C语言
C语言白话数组数据查找(遍历查找、二分查找)
C语言白话数组数据查找(遍历查找、二分查找)
153 0
C语言白话数组数据查找(遍历查找、二分查找)
|
存储 算法 搜索推荐
八大排序算法总结+例题练习(正在不断补充...)
八大排序算法总结+例题练习(正在不断补充...)
八大排序算法总结+例题练习(正在不断补充...)
看代码求结果练习题(递归例题)
看代码求结果练习题(递归例题)
95 0
看代码求结果练习题(递归例题)
|
算法
【Day19】LeetCode算法刷题(附带解题思路、代码注释详细) 【777. 在LR字符串中交换相邻字符】 【54. 螺旋矩阵】
学习了解附带解题思路、代码注释详细) 【777. 在LR字符串中交换相邻字符】 【54. 螺旋矩阵】。
118 0
【Day19】LeetCode算法刷题(附带解题思路、代码注释详细) 【777. 在LR字符串中交换相邻字符】 【54. 螺旋矩阵】
|
SQL 小程序 数据挖掘
c语言递归思想的小程序 | 数字三角形求路径最大值
c语言递归思想的小程序 | 数字三角形求路径最大值
206 0
c语言递归思想的小程序 | 数字三角形求路径最大值