在排序陣列中查詢數字
統計乙個數字在排序陣列**現的次數。
示例 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...