zoukankan      html  css  js  c++  java
  • 剑指offer 数字在排序数组中出现的次数

    题目描述

    统计一个数字在排序数组中出现的次数。
     
    思路:这题有两个点可以想到使用二分法,
    1)排序的数组;
    2)暴力求解的复杂度是O(n),要想优化只有二分法的logn级别。
     
    和使用二分法找到某个数出现的区间一样,只不过要多一个变量判断是否找到这个数,因为如果不存在这个数那么两次二分法找到的位置和元素只有一个出现最后一个位置的答案是一样的,所以要多用一个变量进行判断。
    class Solution {
    public:
        int GetNumberOfK(vector<int> data ,int k) {
            if(data.size() == 0){
                return 0;
            }
            int start = 0,end = data.size() - 1;
            int mid;
            bool firstFindIt = true;
            while(start + 1 < end){
                mid = start + (end - start) / 2;
                if(data[mid] == k){
                    end = mid;
                }
                else if(data[mid] < k){
                    start = mid;
                }
                else{
                    end = mid;
                }
            }
            int firstPos = 0;
            if(data[start] == k){
                firstPos = start;
            }
            else if(data[end] == k){
                firstPos = end;
            }
            else{
                firstFindIt = false;
            }
            
            start = 0;
            end = data.size() - 1;        
            while(start + 1 < end){
                mid = start + (end - start) / 2;
                if(data[mid] == k){
                    start = mid;
                }
                else if(data[mid] < k){
                    start = mid;
                }
                else{
                    end = mid;
                }
                
            }
            int lastPos = 0;
            bool lastFindIt = true;
            if(data[end] == k){
                lastPos = end;            
            }
            else if(data[start] == k){
                lastPos = start;
            }
            else{
                lastFindIt = false;
            }
            if(firstFindIt == true && lastFindIt == true){
                return lastPos - firstPos + 1;
            }
                    
            return 0;
            
        }
    };
  • 相关阅读:
    496. 下一个更大元素 I 力扣(简单) 单调栈
    240. 搜索二维矩阵 II 力扣(中等) Z字型查找
    638. 大礼包 力扣(中等) 记忆化搜索,弱点
    453. 最小操作次数使数组元素相等 力扣(简单) 没想出来
    传纸条
    同余方程
    花匠
    华容道
    货车运输
    火柴排队
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/7493431.html
Copyright © 2011-2022 走看看