矩阵二分查找 java6,leetcode:Search for a Range(数组,二分查找)

Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,

Given [5, 7, 7, 8, 8, 10] and target value 8,

return [3, 4].

分析:题意为在一个有序数组中找到给定目标值的起始位置并返回,如果目标值不存在则返回[1,1].

思路:使用binarySearchLow()去找到不小于目标值数字的最小索引,使用binarySearchUp()去找到不大于目标值数字的最大索引,然后即可得到索引范围。

code如下:

class Solution {

private:

int binarySearchLow(vector& nums, int target, int begin, int end)

{

if(begin > end) return begin;

int mid = begin + (end - begin) / 2;

if(nums[mid] < target) return binarySearchLow(nums, target, mid + 1, end);

else return binarySearchLow(nums, target, begin, mid - 1);

}

int binarySearchUp(vector& nums, int target, int begin, int end)

{

if(begin > end) return end;

int mid = begin + (end - begin) / 2;

if(nums[mid] > target) return binarySearchUp(nums, target, begin, mid - 1);

else return binarySearchUp(nums, target, mid + 1, end);

}

public:

vector searchRange(vector& nums, int target) {

vector res(2, -1);

if(nums.empty()) return res;

int high = binarySearchUp(nums, target, 0, nums.size() -1);

int low = binarySearchLow(nums, target, 0, nums.size() - 1);

if(high >= low)

{

res[0] = low;

res[1] = high;

return res;

}

return res;

}

};

其他方法:先找到有序数组中与目标值相同的数字的位置,然后检查其个数.

code:

class Solution {

public:

vector searchRange(vector& nums, int target) {

int low=0;

int high=nums.size()-1;

vector ans(2,-1);

int flag=-1; //数组中是否存在与目标值相同数字的标志

int start,end;

while(low<=high){

int mid=(low+high)/2;

if(nums[mid]

low=mid+1;

}

else if(nums[mid]>target){

high=mid-1;

}

else{

flag=mid;

break;

}

}

if(flag!=-1){

start=flag;

while(start>=0 && nums[start]==target){

start--;

}

ans[0]=start+1;

end=flag;

while(end < nums.size() && nums[end]==target){

end++;

}

ans[1]=end-1;

}

return ans;

}

};

其他解法:解决问题的短代码(使用迭代器)

class Solution {

public:

vector searchRange(vector& nums, int target) {

vector ret;

vector::iterator start = find(nums.begin(), nums.end(), target);

vector::reverse_iterator end = find(nums.rbegin(), nums.rend(), target);

ret.push_back( (start == nums.end() ? -1 : start-nums.begin() ) ),ret.push_back(nums.size() - 1 - (end - nums.rbegin()));

return ret;

}

};

python:

class Solution(object):

def searchRange(self, nums, target):

"""

:type nums: List[int]

:type target: int

:rtype: List[int]

"""

if target not in nums:

return ([-1,-1])

low = nums.index(target)

nums.sort(reverse=True)

high = len(nums)-nums.index(target)-1

result = []

result.append(low)

result.append(high)

return (result)

&lbrack;LeetCode&rsqb; &num;167&num; Two Sum II &colon; 数组&sol;二分查找&sol;双指针

一. 题目 1. Two Sum II Given an array of integers that is already sorted in ascending order, find two n ...

LeetCode Search a 2D Matrix(二分查找)

题意: 有一个矩阵,每行都有序,每行接在上一行尾后仍然有序.在此矩阵中查找是否存在某个数target. 思路: 这相当于用一个指针连续扫二维数组一样,一直p++就能到最后一个元素了.由于用vector ...

&lbrack;LeetCode&rsqb; 74 Search a 2D Matrix(二分查找)

二分查找 1.二分查找的时间复杂度分析: 二分查找每次排除掉一半不合适的值,所以对于n个元素的情况来说: 一次二分剩下:n/2 两次:n/4 m次:n/(2^m) 最坏情况是排除到最后一个值之后得到结 ...

LeetCode OJ:Search for a Range(区间查找)

Given a sorted array of integers, find the starting and ending position of a given target value. You ...

&lbrack;LeetCode&rsqb; Search for a Range 搜索一个范围

Given a sorted array of integers, find the starting and ending position of a given target value. You ...

【leetcode边做边学】二分查找应用

很多其它请关注我的HEXO博客:http://jasonding1354.github.io/ 简书主页:http://www.jianshu.com/users/2bd9b48f6ea8/lates ...

LeetCode&colon; Search for a Range 解题报告

Search for a RangeGiven a sorted array of integers, find the starting and ending position of a given ...

Leetcode题目34&period;在排序数组中查找元素的第一个和最后一个位置(中等)

题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...

PAT-1057 Stack (树状数组 &plus; 二分查找)

1057. Stack Stack is one of the most fundamental data structures, which is based on the principle of ...

&lbrack;LeetCode&rsqb; Search for a Range &lbrack;34&rsqb;

题目 Given a sorted array of integers, find the starting and ending position of a given target value. ...

随机推荐

vim 设置行号

1.打开vim 输入 :echo $VIM 查看vim路径 一般是/use/share/vim 2.sudo vim vimrc 打开配置文件,G到文件末尾 3. 插入 :set number 保存推 ...

java 文件按行读取

/*代码写的可能有点累赘里面的好多东西写的不太好 还望各位大佬能提点一二,不胜感激*/package com.zzp.fileopration;import java.io.*;/** * Creat ...

Sublime Text 2 快捷键 插件配置

一.前言之前 从设计到前端,有过一段时间是懵懵懂懂的状态,缺乏对整个职业更加深入的了解.后来混迹于各个前端大牛的博客,在各个QQ群里聆听各路大神的经验之谈,坚定了前端之路的信心.一直收藏各类精华的帖子 ...

Serial Splitter 4&period;2 串口拆分说明

使用方法 有些设备和程序只能使用COM端口.如果计算机没有COM端口,或者已经被其他应用程序占用,则需要创建虚拟串行端口.在串行分配器中,我们使用虚拟串行端口驱动程序技术,它可以在系统中创建任意数量的 ...

shell脚本学习1(Linux脚本攻略)

sudo < arguments> 等价于root权限执行命令 赋予所有用户文件的可执行权限:chmod a+x script.sh 执行脚本:./scri ...

MySQL服务安装

1.将mysql的安装文件放入服务器里面 2.进行yum源的修改 3.依次安装mysql的5个文件 最后一个server需要的依赖太多,所以用yum进行安装. 或者直接全部用yum进行安装 6.进行m ...

js动态检测加载 JQ

var jqcdnurl = 'https://cdn.bootcss.com/jquery/3.2.1/jquery.js'; //控制台输出 function log() { for (var i ...

windows7安装node

一.在官网下载node 二.按照提示进行安装 三.安装好的目录结构 四.测试是否安装好了node 首先按快捷键win+r,在运行窗口输入cmd,调出命令提示窗口,在命令提示窗口中输入path查看nod ...

oracle关键字大全--注意不要乱用哦

遇到怀疑可能使用了关键字,就来搜一搜吧 ... Oracle 关键字(保留字) 大全 其实这个东西可以在oracle 上输入一个sql语句就可以得到: select * from v$reserved ...

FreeRTOS 任务栈大小确定及其溢出检测

以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的任务栈设置不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要. 局部变量,函数调 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值