首页 > 其他分享 >LeetCode:Search Algorithm

LeetCode:Search Algorithm

时间:2023-04-18 22:22:10浏览次数:28  
标签:map Search return target Algorithm mid dic LeetCode row

LeetCode:Search Algorithm

image-20230308190959905

1\First unique char

image-20230308191148757


Algorithm Design

  1. 利用字符数量的有限性,通过数组来映射(避免Hash_map的高复杂度)
  • 注意数组声明为int A[26]而不是char A[26];

    if(s=="") return ' ';
     	 int A[26]={0,0};
     	 for(int i=0;i<s.length();i++){
     	     A[s[i]-0x61]++;
     	 }
     	 for(int i=0;i<s.length();i++){
     	     if(A[s[i]-0x61]==1){
     	         return s[i];
     	     }
     	 }        
     	 return ' ';
    
  1. Dict/Hash_map
	unordered_map<char,int> map;
     for(auto i:s){
         map[i]++;
     }
     for(auto i:s){
         if(map[i]==1){
             return i;
         }
     }
     return ' ';
  • dic[c] = dic.find(c) == dic.end();

    	unordered_map<char, bool> dic;
        for(char c : s)
        dic[c] = dic.find(c) == dic.end(); //很有意思的写法
        for(char c : s)
            if(dic[c]) return c;
        return ' ';
    

2\Min(Rotated Array)

image-20230308194115986

Algorithm Design

  1. 两个有序升序数组,前一个比后一个大;
  2. 可以通过nums[mid]>nums[left]判断后left=mid+1(这里nums[mid]不可能是结果所以mid+1)
  3. 也可通过nums[mid]<nums[right]right=mid(这里nums[mid]可能是结果所以right=mid;
  4. 后者更好因为题目要求可以适应旋转量为0,如图,那么后者可以使得right不断左移到达min处;

image-20230308194154986

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int l=0,r=numbers.size()-1;
        while(l<r){
            int mid=(l+r)>>1;
            if(numbers[mid]<numbers[r]){
                r=mid;
            }else if(numbers[mid]>numbers[r]){
                l=mid+1;
            }else{
                r--;
            }
        }
        return numbers[r];
    }
};
//  3 4 5 5 5 5 5 5 5 0 0 0 1 2 2 2 2 2 2 
// 3 4 5 1 2

3\Search in Ordered Martix

image-20230308195531226

Algorithm Design

  1. Z字形找,从左下或右上开始

    可以理解为左下角的数是该行的最小值,该列的最大值。所以如果target比左下角还小,则肯定比这一行都小,所以可以上移一行寻找;如果target比左下角还大,则肯定比这一列都大,所以可以右移一列寻找

             //左下
    		 if(matrix.empty()) return false; //注意先检查
    		 int i=matrix.size()-1,j=0;
             while(j<matrix[0].size()&&i>=0){
                 if(matrix[i][j]==target){
                     return true;
                 }else if(matrix[i][j]<target){
                     j++;
                 }else{
                     i--;
                 }
             }
             return false;
    
  2. 局部二分

        bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
            for(auto row:matrix){
                // auto have_target=find_if(row.begin(),row.end(),[&target](auto x){return x==target;});
                // if(have_target!=row.end()) return true;
                 auto it = lower_bound(row.begin(), row.end(), target);
                if (it != row.end() && *it == target) {
                    return true;
                }
            }
            return false;
        }
    

标签:map,Search,return,target,Algorithm,mid,dic,LeetCode,row
From: https://www.cnblogs.com/LogicHan/p/17331416.html

相关文章

  • leetcode-206反转链表
    反转链表方法一:迭代法/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,ListNode*next)......
  • leetcode刷题随笔(1)
     11.盛水最多的容器暴力求解超时问题的解决intmaxArea(vector<int>&height){intmax=0;intn=height.size();intnum;inti,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i<j)......
  • Windows下 Elasticsearch 0基础安装
    1.javajdk1.8以上安装https://www.oracle.com/java/technologies/downloads/#jdk20-windows2.Elasticsearch7.6安装https://elasticsearch.cn/download/3.Elasticsearch-head安装https://github.com/mobz/elasticsearch-head原文链接:javajdk安装环境配置:https://ww......
  • 【LeetCode剑指offer 03】合并两个/K个排序链表
    合并两个排序链表https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4,1->3->4输出:1->1->2->3->4->4限制:0<=链表长度<=1000思路代码classSolutio......
  • 部署多节点elasticsearch集群的shell脚本
    以下是一个部署多个节点的elasticsearch集群的shell脚本示例:#!/bin/bash#设置集群名称CLUSTER_NAME="my_cluster"#设置elasticsearch版本号ES_VERSION="7.10.2"#设置elasticsearch安装目录ES_HOME="/usr/local/elasticsearch"#设置elasticsearch数据目录DATA_DI......
  • elasticsearch优化思路
    一、优化方案调整并发线程数在高并发场景下,Elasticsearch服务的并发线程数需要调整到合适的值,避免线程数过多导致CPU资源浪费和内存开销增加。同时也需要避免线程数过少导致请求响应时间过长。可以通过调整Elasticsearch的线程池参数来实现。调整分片数量Elasticsearch的......
  • 【LeetCode动态规划#07】01背包问题一维写法(状态压缩)实战,其二(目标和、零一和)
    目标和(放满背包的方法有几种)力扣题目链接(opensnewwindow)难度:中等给定一个非负整数数组,a1,a2,...,an,和一个目标数,S。现在你有两个符号+和-。对于数组中的任意一个整数,你都可以从+或-中选择一个符号添加在前面。返回可以使最终数组和为目标数S的所有添加符号的......
  • [Leetcode]删除链表中等于val 的所有结点
    力扣链接方法一:使用前后两个指针,cur指向当前位置,prev指向前一个位置,通过改变指向和释放结点来删除val初步代码,还存在问题:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*remo......
  • 4月17日leetcode二叉树的层序遍历II
    给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)(出自力扣)这个昨天的二叉树的层序遍历有所不同:需要将从后往前层序遍历二叉树,其实很简单,只需要用vector的逆置函数,将vector中的vector逆置即可。这里顺便......
  • LeetCode Top100: 二叉树的最大深度 (python)
     给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/\920/\157返回它的最大深度 3。 以下是Python代码实现:cl......