查找元素在list中的位置以及折半查询

问题

查找某个值在list中的位置

解决思路

可以用折半查询的方法解决此问题。

解决(Python)

#! /usr/bin/env python
#coding:utf-8

#折半查找某个元素在list中的位置

def half_search(lst,value,left,right):
    length = len(lst)
    while left<right:
        middle = (right-left)/2
        if lst[middle]>value:
            right = middle-1
        elif lst[middle]<value:
            left = middle+1
        else:
            return middle 

if __name__=="__main__":
    lst=sorted([2,4,5,9])    #折半算法中list要进行排序
    length = len(lst)
    left = 0
    right = length-1
    value =4
    result = half_search(lst,value,left,right)
    if result:
        print result
    else:
        print "There is no the value that you want to search."

再思考

对于上面的折半方法,在python中,可以通过一个函数实现

lst = sorted([2,4,5,9])    #这里进行排序,主要是为了得到与上面方法一样的结果。事实上,list.index()可以针对任何list操作,不一定非要排序
result = lst.index(4)

此外,如果遇到list中有多个相同的元素,应该如何将这些元素的位置都查询出来呢?下面的方法是用python实现。

def find_value_location(lst,value):
    result = [i for i in range(len(lst)) if value==lst[i]]
    return result

更多用python实现的算法,请看:https://github.com/qiwsir/algorithm

qiwsir#gmail.com

查找元素在list中的位置以及折半查询,布布扣,bubuko.com

时间: 2024-12-10 07:13:16

查找元素在list中的位置以及折半查询的相关文章

关于js获取元素在屏幕中的位置的方法

针对我们获取元素在页面中的位置的问题,我们还是用老师一峰老师的方法来解决吧 下面上HTML代码 <div class="left_footer"> <p data-num="1" ref="data" @mouseenter="mOver($event)" @mouseleave="mOut($event)">上</p> <p data-num="2&qu

Search Insert Position 查找给定元素在数组中的位置,若没有则返回应该在的位置

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You may assume no duplicates in the array. Here are few examples.[1,3,5,6], 5 → 2[1,3,5,6], 2 →

_DataStructure_C_Impl:在顺序表中查找元素

// _DataStructure_C_Impl:Search #include<stdio.h> #include<stdlib.h> #define MaxSize 100 #define IndexSize 20 typedef int KeyType; //元素的定义 typedef struct{ KeyType key; }DataType; //顺序表的类型定义 typedef struct{ DataType list[MaxSize]; int length; }

[leetcode] 34. 在排序数组中查找元素的第一个和最后一个位置(Java)

34. 在排序数组中查找元素的第一个和最后一个位置 题目要求用O(logn),明显要用二分. 其实二分不难,难的是要处理好边界 class Solution { public int[] searchRange(int[] nums, int target) { int i = 0, j = nums.length; int mid = (i + j) / 2; int p = -1; while (i < j) { if (nums[mid] == target) { p = mid; bre

Leetcode_34【在排序数组中查找元素的第一个和最后一个位置】

文章目录: 题目 脚本一 脚本一逻辑 题目: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [-1, -1]. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2: 输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1] 脚本一:[用时:96m

(查找)找到数组中的指定值得起始和结束位置

题目: 给定整数的排序数组,找到给定目标值的起始和结束位置. 您的算法的运行时复杂性必须是O(log n)的顺序. 如果在数组中找不到目标,则返回[-1,-1]. 例如, 给定[5,7,7,8,8,10]和目标值8, return [3,4]. 思路:这个题目直接使用容器存储出现查找元素的位置.取出第一个和最后一个即可. 代码 class Solution { public: vector<int> searchRange(int A[], int n, int target) { vecto

【面试题】-数组A中任意两个相邻元素大小相差1,找出某个数在数组A中的位置。(所有位置 )

题目描述 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置. 解题思路 对于目标t,由当前位置a[index]比较开始,下一个可能位置为index = abs(t-a[index]),因为要找出所有的位置,所以找出第一个下标位置之后,再从这个下标的下一个开始重新查找. 代码实现 #include <stdio.h> #include <stdlib.h> #include <math.h> int find_num(int a[

[Swift]扩展String类:实现find()查找子字符串在父字符串中的位置

类似于C++中的find()函数:比较等于val的范围中第一个元素的迭代器.如果没有元素匹配,则函数最后返回. 返回值是子字符串在父字符串中的位置(下标记录), 如果没有找到,那么会返回一个特别的标记npos(-1). 返回值可以看成是一个Int型的数. 1 //String扩展 2 extension String { 3 // 截取字符串:从index到结束处 4 // - Parameter index: 开始索引 5 // - Returns: 子字符串 6 func subString

在排序数组中查找元素

/* 34.在排序数组中查找元素的第一个和最后一个位置. 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [-1, -1]. */ #include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include<mat