编程:找出所有符合条件的元素

题目:给出一个元素无序的数组,求出一个数,使得其左边的数都小于它,右边的数都大于等于它。

举例:[1,2,3,1,2,0,5,6],返回下标6(数字为5)。

思路:

time complexity:O(n) space complexity:O(1)

int findnum(vector<int>& nums){
    if(nums.empty()) return -1;
    int cur = 0; //当前符合条件的元素下标
    int maxv = nums[0]; //目前已遍历数组的最大值
    bool flag = true; //当前遍历到的元素是否符合条件
    for(int i = 1; i < nums.size(); ++ i){
        if(flag && nums[i] < nums[cur]) flag = false;
        if(!flag && maxv <= nums[i]){
            flag = true;
            cur = i;
        }
        maxv = max(maxv, nums[i]);
    }
    return flag ? cur : -1;
}

进阶题目:一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。

举例:[1,2,3,1,2,0,5,5] : 输出[5,5]

思路:1.构建辅助数组min_right[i],表示子数组nums[i...n-1]中的最小值;2.定义maxv表示从左到右遍历nums数组过程中的最大值;3.当maxv == min_right[i]时符合条件。

time complexity:O(n) space complexity:O(n)

vector<int> specialnum(vector<int> &nums){
    vector<int> res;
    if(nums.empty()) return res;
    int n = nums.size();

    vector<int> min_right(n);
    min_right[n-1] = nums[n-1];
    for(int i = n - 2; i >= 0; -- i){
        min_right[i] = nums[i] < min_right[i+1] ? nums[i] : min_right[i+1];
    }

    int maxv = nums[0];
    for(int i = 1; i < n; ++ i){
        maxv = nums[i] > maxv ? nums[i] : maxv;
        if(maxv == min_right[i]) res.push_back(maxv);
    }

    for(int i = 0; i < res.size(); ++ i){
        cout << res[i] << ' ';
    }
    return res;
}

原文地址:https://www.cnblogs.com/xiaobaizzz/p/12436785.html

时间: 2024-10-12 07:46:54

编程:找出所有符合条件的元素的相关文章

关于使用一条SQL语句 找出同时符合多个tag条件的记录集合算法

表结构 Tag Table:{tag_id, tag_name}  #标签表 News Table:{news_id, title,......}  #新闻表 NewsTags Table:{tag_id, news_id}  #新闻的标签关系表 解释: 一条新闻,有多个tag标签,例如: 新闻a{Tag1,Tag2, Tag3, Tag4} 新闻b{Tag1,Tag6, Tag7, Tag8} 新闻c{Tag8,Tag9, Tag10, Tag1} 新闻...{Tag..., .....} 搜

自定义JS函数,获取CLASS属性符合条件的元素

function getElementsClass(classnames){ var classobj=new Array(); var classint=0;//定义数组的下标 var tags=document.getElementsByTagName("*");//获取所有元素 for(i=0;i<tags.length;i++){//筛选出所有class属性符合条件的元素 if(tags[i].className == classnames){ classobj[clas

笔试算法题(24):找出出现次数超过一半的元素 &amp; 二叉树最近公共父节点

出题:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字: 分析: 解法1:首先对数组进行排序,时间复杂度为O(NlogN),由于有一个数字出现次数超过了数组的一半,所以如果二分数组的话,划分元素肯定就是这个数字: 解法2:首先创建1/2数组大小的Hash Table(哈希表可以替代排序时间,由于一个数字出现超过了数组的一半,所以不同元素个数肯定不大于数组的一半),空间复杂度O(N),顺序扫描映射数 组元素到Hash Table中并计数,最后顺序扫描Hash Table,计数超过数组

题目:一个数如果恰好等于它的因子之和,这个数就称为 &quot;完数 &quot;。例如6=1+2+3.编程&#160;&#160;&#160;&#160; 找出1000以内的所有完数。

题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 ".例如6=1+2+3.编程     找出1000以内的所有完数. 1 package day11_2; 2 3 public class lianxi09 { 4 public static void main(String[] args) { 5 6 for (int i = 1; i < 1000; i++) { 7 int sum=0; 8 for (int j = 1; j <i; j++) { 9 10

[算法]找出数组当中的中枢元素

给定一个整型数组,找出pivot,使得对于任意i < pivot,a[i] <=a[pivot],对于i > pivot,a[i]>=a[pivot],只能用一个额外的数组,和少量空间. 思路 1.使用一个数组t记录,t[i]记录的是a[0]~a[i]的最大值 int *t = new int[n]; for(int i = 0, max = ~0; i < n; ++i){ if(a[i] > max){ max = a[i]; } t[i] = max; } 2.从

442. 找出数组中重复的元素 Find All Duplicates in an ArrayGiven an array of integers

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,

【Java】编程找出1000以内的所有完数。

1 package com.xt.homework.hw09; 2 /** 3 * 5. 一个正整数,如果恰好等于除它本身外的所有因子之和,这个数就称为"完数". 4 * 例如6=1+2+3,编程找出1000以内的所有完数. 5 * 6 * 7 * @author 天耀二期 8 * 杨勃隆 9 */ 10 public class HomeWork05 { 11 public static void main(String[] args){ 12 { 13 int i,j,k; 14

9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 可以假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组被旋转过了,则寻找拐点. * @param a * @param left * @param right * @param x:要搜索的元素 * @return */ public static int search(int[] a,int left,int right,int x){ int mid=(

[ jquery 位置选择器 :first-child :last-child ] 强化说明:选取属于其父元素和所有兄弟元素中子元素集合中处于第一个(最后一个)位置上符合条件的元素

强化说明:选取属于其父元素和所有兄弟元素中子元素集合中处于第一个(最后一个)位置上符合条件的元素 注意和:first :last 的区别 实例: <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title> <meta http-equiv='description' content='this is my page'> <meta http