λ¬Έμ νμ
μ€λ¦μ°¨μμΌλ‘ μ λ ¬λμ΄ μλ λ°°μ΄ nums
κ° μμλ€.
μΈλ±μ€ k
λ²μ§Έ μμκ° μ μΌ μ²« μμκ° λλλ‘ rotated
λμ΄μλ€.
target
μ΄ λ°°μ΄ nums
μ ν¬ν¨λμ΄μλμ§ O(logN) μΌλ‘ νμνμ¬ μΈλ±μ€λ₯Ό λ°νν΄μΌνλ€.
νμ΄
1οΈβ£ μ΄λΆ νμμ μ΄μ©ν νμ΄
π‘ λ μ€λ₯Έ Idea
λ¨Όμ , μ£Όμ΄μ§ μκ° λ³΅μ‘λλ₯Ό λ§μ‘±νκΈ° μν΄μ μ΄λΆ νμμ μ¬μ©ν΄μΌν¨μ μ μ μμλ€.
κ²°κ³Όμ μΌλ‘λ,target
μ΄nums
μ μ‘΄μ¬νλμ§λ₯Ό μ΄λΆ νμν΄μΌνλλ°
νΉμ κ°μ νμνκΈ° μν΄μ μ λ ¬λμ΄μμ΄μΌ νλ€.
λ°λΌμ, rotatedλ λ°°μ΄μ μ λ ¬λ λκ°μ λ°°μ΄λ‘ λλκΈ° μν΄ λ°°μ΄ λ΄μ μ΅μκ°μ κ²μνλ€.
ex)[4, 5, 6, 7, 0, 1, 2]
λ°°μ΄μ΄ μμ λ,[4, 5, 6, 7]
κ³Ό[0, 1, 2]
λ°°μ΄2
κ°λ‘ λΆλ¦¬νλ€. μ΅μκ°μΈ0
μ μμΉλ₯Ό μ°ΎμμΌ λΆλ¦¬ν μ μμ κ²μ΄λ€.
μ΅μκ°μ midμ μμΉν μμκ° κ°μ₯ λκ°κ³Ό λΉκ΅νμ λ, μ€λ¦μ°¨μμ μ μ§νκ³ μλ€λ©΄ νμμ μΌμͺ½ μμμΌλ‘ μ΄λμν€λ λ°©λ²μΌλ‘ ꡬν μ μλ€. κ·Έ λ°λλΌλ©΄ μ€λ₯Έμͺ½ μμμΌλ‘ νμν΄μΌν κ²μ΄λ€.
μ λ ¬λ λ°°μ΄ 2κ°λ‘ λΆλ¦¬νλ€λ©΄, μ΄λΆνμμΌλ‘target
μ΄ μ‘΄μ¬νλμ§ νμΈνλ©΄ μλ£λλ€.
class Solution {
public int search(int[] nums, int target) {
int idx = getStartIdx(nums);
int result1 = findIdx(nums,0,idx-1,target);
int result2 = findIdx(nums,idx,nums.length-1,target);
return Math.max(result1,result2);
}
private int getStartIdx(int[] nums){
int left = 0,right = nums.length-1;
if(nums[left]<=nums[right]){
return 0;
}
while(left<right){
int mid = (left+right)/2;
if(nums[mid]<=nums[right]){
right = mid;
}else{
left = mid+1;
}
}
return left;
}
private int findIdx(int[] nums, int left, int right,int target){
while(left<=right){
int mid = (left + right)/2;
if(target<nums[mid]){
right = mid-1;
}else if(target>nums[mid]){
left = mid+1;
}else{
return mid;
}
}
return -1;
}
}
κ²°κ³Ό
π νκ³
μ λ ¬λμ΄ μμ§ μμ λ°°μ΄μμ μ΄λΆνμμ μ¬μ©νκΈ° μν 쑰건μ λ μ¬λ¦¬λκ² κ΅μ₯ν κΉλ€λ‘μ΄ κ² κ°λ€.
κ·Όλ°, μ μκ°ν΄λ³΄λ©΄ μΆ©λΆν λ μ¬λ¦΄ μ μλ μμ΄λμ΄λ€μ΄λ€.
find peak element λ¬Έμ μμλ mid
κ°μ΄ mid+1
λ³΄λ€ μμΌλ©΄ μ€λ₯Έμͺ½ μμμ νμνλ λ°©μμΌλ‘ μ§ννμκ³
μ΄λ² λ¬Έμ μ κ²½μ°μλ mid
κ°μ΄ right
κ°λ³΄λ€ μμ κ²½μ°, μ€λ₯Έμͺ½ μμμ μ€λ¦μ°¨μμΌλ‘ ꡬμ±λμ΄μμμ 보μ₯νλ―λ‘ μΌμͺ½ μμμΌλ‘ νμνλ λ°©μμ΄μλ€.
μ΄λ¬ν μ΄λΆ νμ 쑰건λ€μ μ μ°ΎμλΌ μ μλλ‘ κ³ λ―Όμ ν΄λ΄μΌκ² λ€λ μκ°μ΄ λ€μλ€.