Template & Tips

binary search ๆฆ‚ๅฟตๆ˜ฏ, ่ฆๆ‰พๅทฆๅŠ้ƒจ้‚„ๆ˜ฏๅณๅŠ้ƒจ๏ผŸ

ไธ‰ๅˆ†ๆณ• use left <= left

ไบŒๅˆ†ๆณ• use left < left

1. ๆ‰พๆจก็ณŠๅ€ผ first or last occurrence, ไบŒๅˆ†ๆณ•

see leetcode 34

        int left = 0;
        int right = nums.length - 1;
        // find first occurrence
        while (left < right) {
            int mid = left + (right - left)/2;

            if (nums[mid] < target) { // ๅพ€ๅณๅŠ้ƒจๆ‰พ
                left = mid + 1;
            } else { // ๅพ€ๅทฆๅŠ้ƒจๆ‰พ
                right = mid;
            }
        }
        return left; // right
        
        // find last occurrence
        while (left  < right) {
            int mid = left + (right - left + 1)/2; // notice! +1

            if (nums[mid] > target) { // ๅพ€ๅทฆๅŠ้ƒจๆ‰พ
                right = mid - 1;
            } else { // ๅพ€ๅณๅŠ้ƒจๆ‰พ
                left = mid;
            }
        }
        return left;

2. ๆ‰พ็ขบๅˆ‡ๅ€ผ, ไธ‰ๅˆ†ๆณ•, template,

left, right = 0, len(array) - 1 
while left <= right: 
    // (left + right) >>> 1 is best!
	  mid = (left + right) >>> 1    // left + (right - left) / 2 
	  if array[mid] == target: 
		    # find the target!! 
		    break or return result 
	  elif array[mid] < target: 
		    left = mid + 1 
	  else: 
		    right = mid - 1
  1. when do you use while (start < end) , when do you use while (start <= end) ?

You use while (start <= end) if you are returning the match from inside the loop.

You use while (start < end) if you want to exit out of the loop first, and then use the result of start or end to return the match.

ๅฏไปฅๅƒ่€ƒ้€™็ฏ‡็š„ๆ€่ทฏ๏ผš

https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/

3. ๆ‰พๆœ€่ฟ‘ไผผๅ€ผ (closet to ...)

        int left = 0;
        int right = nums.length - 1;
        // find first occurrence
        while (left + 1 < right) {
            int mid = (left + right) >>> 1; 

            if (nums[mid] < target) { // ๅพ€ๅณๅŠ้ƒจๆ‰พ
                left = mid;
            } else { // ๅพ€ๅทฆๅŠ้ƒจๆ‰พ
                right = mid;
            }
        }
        if (nums[right] < target) { // right < target , target ๆœ€ๅคง 
            return right;
        } else if (nums[left] > target) { //  target  < left  , target ๆœ€ๅฐ
            return left;
        } else { // left < target < right ,  target ไป‹ๆ–ผไธญ้–“
            return (target - nums[left] < nums[right] - target) ? left : right;
        }
        

find peak (162)

if (nums[mid] < nums[mid+1]) {
    left = mid + 1;
} else {
    right = mid;
}

Rotated

            while (left <= right) ...
            
            // duplicate ๅคš้€™ๅ€‹ๆขไปถ
            if (nums[start] == nums[mid] && nums[mid] == nums[end]) {
                start++;
                end--;
            } else if (nums[start] <= nums[mid]) {
                if (nums[start] <= target && target <= nums[mid]) { // in left
                    end = mid - 1;
                } else {
                    start = mid + 1;
                }
                    
            } else {
                if (nums[mid] <= target && target <= nums[end]) {
                    start = mid + 1;
                } else {
                    end = mid - 1;
                }
            }

Mini in Rotated

if (nums[mid] > nums[right]) {
    left = mid + 1;
} else {
    right = mid;
}

// duplicate
if (nums[mid] > nums[right]) {
    left = mid + 1;
} else if (nums[mid] < nums[right]) {
    right = mid;
} else { // nums[mid] == nums[right] .=> add this 
    right--;
}

ไบŒๅˆ†ๆณ•

ไบŒๅˆ†ๆŸฅๆ‰พ tips

decrease and conquer template

ๅŽŸๅง‹ binary search ๅฏซๆณ•ๅˆ†ๆˆไธ‰้ƒจๅˆ†

ๅฆไธ€็จฎๅšๆณ•

decrease and conquer, ๆœๆŽ’้™ค mid ๆ€่€ƒ, ๅˆ†็‚บๅ…ฉ้ƒจไปฝ

while(left < right) ้€™ๆจฃๅฏซ้€€ๅ‡บๆ™‚, left == right, ๆ‰€ไปฅๅ›ž left or right ้ƒฝๅฏไปฅ

ๆ นๆ“š้‚Š็•Œๆ”ถ็ธฎ,ไธญ้–“ๅ€ผ่ฆ่€ƒๆ…ฎ ๅชๆœ‰ๅ…ฉๅ€‹ๅ…ƒ็ด ๆ™‚, [0, 1] => mid = (0+1)/2 = 0, ๆฐธ้ ๅ–ไธๅˆฐๅณไธญไฝๆ•ธ

ไธŠๅ–ๆ•ดๅฏไปฅ่งฃๆฑบ

ๆ นๆ“šไป€้บผๆ™‚ๅ€™็‹€ๆณไธๆ˜ฏ่งฃ, ๅฏซif, ifๅฐ else ่‡ช็„ถๅฐ

็ฌฌไบŒ่งฃ, ๅ› ็‚บๅฏไปฅๆ’ๅ…ฅๅœจๆœ€ๅพŒ, ๆ‰€ไปฅๅฏไปฅไธ็”จ็‰นๅˆฅๅˆคๆ–ท, ๆ‰€ไปฅ ๅณ้‚Š็•Œ ๅฏไปฅๆ”นๆˆ len

็ฌฌไธ‰่งฃ, ๅ› ็‚บ็œ‹ๅˆฐ็›ฎๆจ™ๅ…ƒ็ด , ๅฐฑ้”ๆˆ้กŒ็›ฎ่ฆ็š„, ๆ‰€ไปฅๅฏไปฅๅคšไธ€ๅ€‹ == ็š„ๆŒ‘ไปถๅˆคๆ–ท็›ดๆŽฅ่ฟ”ๅ›ž็ญ”ๆกˆ

Last updated