剑指offer——56在排序数组中查找数字

题目描述

统计一个数字在排序数组中出现的次数。

题解:

  使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了

  但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N)的复杂度

  可以再次利用二分法,在第一次找到k的左半部分使用二分法找到不再出现k的位置,其右半部份类似。

  

 1 class Solution01 {
 2 public:
 3     int GetNumberOfK(vector<int> data, int k) {
 4         if (data.size() == 0)return 0;
 5         int L = 0, R = data.size() - 1, M;
 6         while (L <= R)
 7         {
 8             M = (R - L) / 2 + L;
 9             if (data[M] == k)break;
10             else if (data[M] > k)R = M - 1;
11             else L = M + 1;
12         }
13         if (L > R)return 0;
14         L = R = M;
15         int res = 0;
16         while (L >= 0 && data[L] == k) {
17             res++; --L;
18         }
19         while (R<data.size() && data[R] == k) {
20             res++; ++R;
21         }
22         return res - 1;
23     }
24 };
25
26 class Solution02 {
27 public:
28     int GetNumberOfK(vector<int> data, int k) {
29         if (data.size() == 0)return 0;
30         int pM = find(data, 0, data.size() - 1, k);
31         if (data[pM] != k)return 0;
32         int pL = pM, pR = pM;
33         while (pL !=-1 && data[pL] == k) pL = find(data, 0, pL - 1, k);
34         while (pR != -1 && data[pR] == k) pR = find(data, pR + 1, data.size() - 1, k);
35         return (pR == -1 ? data.size() : pR) - pL - 1;
36     }
37     int find(const vector<int>data, int L, int R, const int k)
38     {
39         int M = -1;
40         while (L >= 0 && R < data.size() && L <= R)
41         {
42             M = (R - L) / 2 + L;
43             if (data[M] == k)break;
44             else if (data[M] > k)R = M - 1;
45             else L = M + 1;
46         }
47         return M;
48     }
49 };

原文地址:https://www.cnblogs.com/zzw1024/p/11706308.html

时间: 2024-10-09 17:26:39

剑指offer——56在排序数组中查找数字的相关文章

剑指offer:在排序数组中查找数字

题目: 统计一个数字在排序数组中出现的次数. 例如输入排序数组{1,2,3,3,3,3,4,5},由于3在这个数中出现了4次,输出4. # -*- coding: utf-8 -*- # @Time : 2019-07-13 15:10 # @Author : Jayce Wong # @ProjectName : job # @FileName : getNumberOfK.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : ht

【剑指offer】二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 分析: 首先选择数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.依次类推,直到查找范围为空. 示例程序: #include <stdio.h> #include <stdlib.h> int

剑指OFFER之二维数组中的查找(九度OJ1384)

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字. 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每

【剑指offer】Q29:数组中出现次数超过一半的数字

就本题而言,个人觉得练习下partition函数是有必要的,毕竟它是快速排序的核心,是基础性的东西,也是必须要掌握的,至于书中给出的"取巧"性解法,是属于个人思维能力的考察,是一种考虑问题的思路,不是一两个问题就能练就的. partition函数,包括快速排序,是一定要信手拈来的,必须的. import random def MoreThanHalf(array): if len(array) == 0: return 0 start = 0 end = len(array) - 1

【剑指offer】Q40:数组中出现一次的数字

按着书里面讲述的方法,根据某一位来将整个数组拆分成两个部分,取每一部分中出现一次的数.书中的处理略显复杂,这里简化下分类的方法. def once(array): reOR = 0 for x in array: reOR ^= x bit1 = firstBit1(reOR) first = 0 second = 0 for x in array: if x & bit1 != 0: first ^= x else: second ^= x return first, second def f

【剑指offer】Q40:数组中出现一次的数

书里面关于分类的判断有些麻烦,通过某一位为0为1来对数组元素进行分类.假如第3位为1,那么也就是元素x & 8 等于或不等于0,所以没必要非的用第几位去判断. def once(array): reOR = 0 for x in array: reOR ^= x bit1 = firstBit1(reOR) first = 0 second = 0 for x in array: if x & bit1 != 0: first ^= x else: second ^= x return f

【剑指Offer】面试题53 - I. 在排序数组中查找数字 I

题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例?2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 限制:0 <= 数组长度 <= 50000 本题同[LeetCode]34. 在排序数组中查找元素的第一个和最后一个位置 思路 代码 时间复杂度:O(logn) 空间复杂度:O(1) class Solution { public: int search

剑指offer(2) - 二维数组中的查找

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上往下递增的顺序排序.请写一个函数,输入一个二维数组和一个整数,判断数组中是否含有该整数. 例如下面的二维数组就是每行.每列都是递增顺序,如果在这个数组中查找数字7,则返回true,如果查找数字5,由于数组中不含有该数字,则返回false. 1   2   8   9 2  4   9   12 4  7  10   13 6  8   11   15 public class FindFromMatrix { priv

剑指 Offer——1. 二维数组中的查找

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解法一 利用二位数组有序的特性,首先选取数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每