在排序陣列中查詢數字

2021-10-11 15:55:12 字數 3965 閱讀 9987

在排序陣列中查詢數字

統計乙個數字在排序陣列**現的次數。

示例 1:

輸入:nums = [5,7,7,8,8,10], target = 8輸出:2

示例 2:

輸入:nums = [5,7,7,8,8,10], target = 6輸出:0

我的思路:二分查詢到target,再分別向前向後找等於target的值

public int search(int nums, int target)  else if(nums[mid]=0&&nums[i]==target)

i=mid+1;

while(i方法二:兩次二分確定左右邊界

public int search(int nums, int target) else

}int right=low;//可以理解為遇到小於等於情況都會往後移動,最終會是最後乙個等於target的下乙個位置

low=0;

high=nums.length-1;

//確定左邊界(含等於)

while (low<=high)

//找到應該插入的位置,可以看做是target的右邊界(不包含target)

public int insertpos(int nums,int target) else

}return low;

}

給定乙個按照公升序排列的整數陣列nums,和乙個目標值target。找出給定目標值在陣列中的開始位置和結束位置。

如果陣列中不存在目標值,返回[-1, -1]

示例 1:

輸入:nums = [5,7,7,8,8,10], target = 8輸出:[3,4]

示例 2:

輸入:nums = [5,7,7,8,8,10], target = 6輸出:[-1,-1]

二分查詢,找到元素後再分別向前、向後查詢

public int searchrange(int nums, int target) 

}//向後找最後出現的位置

for (j = mid + 1; j < nums.length; j++)

}ans[0] = i + 1;

ans[1] = j - 1;

break;

} else if (nums[mid] < target) else

}return ans;

}

確定左右邊界

public int searchrange(int nums, int target) ;

}res[1] = searchright(nums, target);

return res;

}public int searchleft(int nums, int target) else

}// 因為low不會等於-1,判斷一下跳出迴圈時nums[low]是否為目標值

if (low < nums.length && nums[low] == target)

return -1;

}public int searchright(int nums, int target) else

}return high;

}

0~n-1中缺失的數字

乙個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0~n-1之內。在範圍0~n-1內的n個數字中有且只有乙個數字不在該陣列中,請找出這個數字。

示例 1:

輸入:[0,1,3]

輸出:2

示例 2:

輸入:[0,1,2,3,4,5,6,7,9]輸出:8

限制:1 <= 陣列長度 <= 10000

我的思路:依次比較,時間複雜度o(n)

public int missingnumber(int nums) 

}return nums.length;

}

二分查詢

既然是有序陣列,考慮使用二分

每次二分,一部分不存在缺失數字,而另一部分存在

public int missingnumber(int nums)  else 

}return left;

}

給你乙個非遞減的有序整數陣列,已知這個陣列中恰好有乙個整數,它的出現次數超過陣列元素總數的 25%。

請你找到並返回這個整數

示例:

輸入:arr = [1,2,2,6,6,6,6,7,10]輸出:6

方法一:統計元素個數

當找到乙個元素出現次數大於25%時返回

方法二:滑動視窗

因為有序,如果某個位置後面1/4長度的元素和當前元素相等,說明它就是目標元素

public int findspecialinteger(int arr) 

}return -1;

}

方法三:二分查詢

根據題目要求,滿足條件的整數 x 至少在陣列 arr **現了 span = arr.length / 4 次,那麼我們可以斷定:陣列 arr 中的元素 arr[0], arr[span], arr[span * 2], ... 一定包含 x

我們可以使用反證法證明上述的結論。假設 arr[0], arr[span], arr[span * 2], ... 均不為 x,由於陣列 arr 已經有序,那麼 x 只會連續地出現在 arr[0], arr[span], arr[span * 2], ... 中某兩個相鄰元素的間隔中,因此其出現的次數最多為 span - 1 次,這與它至少出現 span 次相矛盾

有了上述的結論,我們就可以依次列舉 arr[0], arr[span], arr[span * 2], ... 中的元素,並將每個元素在陣列 arr 上進行二分查詢,得到其在 arr **現的位置區間。如果該區間的長度至少為 span,那麼我們就得到了答案

public int findspecialinteger(int arr) 

}return -1;

}public int leftbound(int arr, int target) else

}return low;

}public int rightbound(int arr, int target) else

}return high;

}

在排序陣列中查詢數字

題目一 數字在排序陣列 現的次數。統計乙個數字在排序陣列 現的次數。例如,輸入排序 陣列和數字3,由於3在這個數 組 現了4次,因此輸出4。設計乙個改進的二分查詢法,分別查詢陣列中第乙個該數字和最後乙個該數字,找到之後 利用索引計算中間該數字的個數 package helen.c public cl...

在排序陣列中查詢數字

統計乙個數字在排序陣列 現的次數。例如,輸入排序陣列和數字3,由於3在這個陣列 現了4次,因此輸出4。有序陣列,二分查詢 思路 用二分查詢分別找到待找數字的第乙個和最後乙個 class solution def getnumberofk self,data,k number 0 if data no...

在排序陣列中查詢數字

劍指offer第53題 題目 數字在排序陣列 現的次數 統計乙個數字在排序陣列 現的次數,例如 輸入排序書序和數字3,由於3在這個陣列 現了4次,因此輸出4 發現這個題用到了二分查詢的思想,因為陣列是排序的,所以我們可以查詢出第一次和最後一次出現k的位置,然後兩個位置差 1就是出現的次數了 貼 pu...