iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
自我挑戰組

用C語言跑完LeetCode 75 - Part 1系列 第 13

[Day 13] LeetCode 75 - 704. Binary Search

  • 分享至 

  • xImage
  •  

LeetCode 75 Level 1 - Day 7 Binary Search

704. Binary Search

題目敘述

Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.
You must write an algorithm with O(log n) runtime complexity.

預設函數

int search(int* nums, int numsSize, int target){

}

題目限制

  • https://chart.googleapis.com/chart?cht=tx&chl=1%20%3C%3D%20nums.length%20%3C%3D%2010%5E4
  • https://chart.googleapis.com/chart?cht=tx&chl=-10%5E4%20%3C%20nums%5Bi%5D%2C%20target%20%3C%2010%5E4
  • All the integers in nums are unique.
  • nums is sorted in ascending order.

解題過程及程式碼

本題是基本的二分搜尋,給一個陣列存放著數值並由小到大排列著,再給一個數值要回傳該數值若在陣列中的位置,若該數值不在陣列中則回傳-1,解題想法就是不停確認資料最中間的元素。

  • 確認中間元素是不是我們要找的目標值?
  • 若中間元素大於目標值目標值在較小的半部,下一個檢查的範圍就可以縮小一半。
  • 若中間元素小於目標值目標值在較大的半部,下一個檢查的範圍就可以縮小一半。
  • 重複以上過程直到剩下的半部數量為1,剩下的若是目標值就找到了,若剩下的不是目標值就表示找不到。

程式碼上傳

int search(int* nums, int numsSize, int target){
    int next_index, next_size, index_start;

    next_index = 0;
    next_size = numsSize;
    index_start = 0;

    if ((next_size == 1) && (nums[0] == target)) {
        return 0;
    }

    next_index = next_size / 2;

    while (next_size > 1) {
        next_index = index_start + (next_size / 2);

        if (nums[next_index] < target) {  // 中間元素 < 目標值

            if (next_size % 2) {
                next_size = (next_size - 1) / 2;
            } else {
                next_size = (next_size / 2) - 1;
            }

            index_start = next_index + 1;
            if ((next_size == 1) && (nums[next_index + 1] == target)) {
                return next_index + 1;
            }

        } else if (nums[next_index] > target) {  // 中間元素 > 目標值

            if (next_size % 2) {
                next_size = (next_size - 1) / 2;
            } else {
                next_size = (next_size / 2);
            }

            if ((next_size == 1) && (nums[next_index - 1] == target)) {
                return next_index - 1;
            }

        } else {
            return next_index;
        }
    }
    return -1;
}

參考資料

今天就到這邊,謝謝大家!
/images/emoticon/emoticon08.gif


上一篇
[Day 12] LeetCode 75 - 102. Binary Tree Level Order Traversal
下一篇
[Day 14] LeetCode 75 - 278. First Bad Version
系列文
用C語言跑完LeetCode 75 - Part 130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言