-
-
Notifications
You must be signed in to change notification settings - Fork 736
Add solution for Challenge 21 by krypton-io #636
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,152 @@ | ||
| package main | ||
|
|
||
| import ( | ||
| "fmt" | ||
| ) | ||
|
|
||
| func main() { | ||
| // Example sorted array for testing | ||
| arr := []int{1, 3, 5, 7, 9, 11, 13, 15, 17, 19} | ||
|
|
||
| // Test binary search | ||
| target := 7 | ||
| index := BinarySearch(arr, target) | ||
| fmt.Printf("BinarySearch: %d found at index %d\n", target, index) | ||
|
|
||
| // Test recursive binary search | ||
| recursiveIndex := BinarySearchRecursive(arr, target, 0, len(arr)-1) | ||
| fmt.Printf("BinarySearchRecursive: %d found at index %d\n", target, recursiveIndex) | ||
|
|
||
| // Test find insert position | ||
| insertTarget := 8 | ||
| insertPos := FindInsertPosition(arr, insertTarget) | ||
| fmt.Printf("FindInsertPosition: %d should be inserted at index %d\n", insertTarget, insertPos) | ||
| } | ||
|
|
||
| // BinarySearch performs a standard binary search to find the target in the sorted array. | ||
| // Returns the index of the target if found, or -1 if not found. | ||
| func BinarySearch(arr []int, target int) int { | ||
| // TODO: Implement this function | ||
|
|
||
| length := len(arr) | ||
|
|
||
| if length == 0 { | ||
| return -1 | ||
| } | ||
|
|
||
| start := 0 | ||
| end := length - 1 | ||
| mid := end / 2 | ||
|
|
||
| if target == arr[start] { | ||
| return start | ||
| } | ||
|
|
||
| if target == arr[end] { | ||
| return end | ||
| } | ||
|
|
||
| for start != mid { | ||
|
|
||
| if target == arr[mid] { | ||
| return mid | ||
| } | ||
|
|
||
| if target < arr[mid] { | ||
| end = mid | ||
| mid /= 2 | ||
| } else { | ||
| start = mid | ||
| mid = mid + ((end - mid) / 2) | ||
| } | ||
| } | ||
|
|
||
| return -1 | ||
| } | ||
|
|
||
| // BinarySearchRecursive performs binary search using recursion. | ||
| // Returns the index of the target if found, or -1 if not found. | ||
| func BinarySearchRecursive(arr []int, target int, left int, right int) int { | ||
| // TODO: Implement this function | ||
|
|
||
| length := len(arr) | ||
| if length == 0 { | ||
| return -1 | ||
| } | ||
|
|
||
| if target == arr[left] { | ||
| return left | ||
| } | ||
|
|
||
| if target == arr[right] { | ||
| return right | ||
| } | ||
|
|
||
| mid := left + ((right - left) / 2) | ||
|
|
||
| if target == arr[mid] { | ||
| return mid | ||
| } | ||
|
|
||
| if left == mid { | ||
| return -1 | ||
| } | ||
|
|
||
| if(target < arr[mid]) { | ||
| return BinarySearchRecursive(arr, target, left, mid) | ||
| } else { | ||
| return BinarySearchRecursive(arr, target, mid, right) | ||
| } | ||
| } | ||
|
|
||
| // FindInsertPosition returns the index where the target should be inserted | ||
| // to maintain the sorted order of the array. | ||
| func FindInsertPosition(arr []int, target int) int { | ||
| // TODO: Implement this function | ||
|
|
||
| length := len(arr) | ||
| start := 0 | ||
| end := length - 1 | ||
| mid := end / 2 | ||
|
|
||
| if length == 0 { | ||
| return 0 | ||
| } | ||
|
|
||
| if target > arr[end] { | ||
| return end + 1 | ||
| } | ||
|
|
||
| if target == arr[start] { | ||
| return start | ||
| } | ||
|
|
||
| if target == arr[end] { | ||
| return end | ||
| } | ||
|
|
||
| for start != mid { | ||
|
|
||
| if target == arr[mid] { | ||
| return mid | ||
| } | ||
|
|
||
| if target < arr[mid] { | ||
| end = mid | ||
| mid /= 2 | ||
| } else { | ||
| start = mid | ||
| mid = mid + ((end - mid) / 2) | ||
| } | ||
| } | ||
|
Comment on lines
+128
to
+141
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical: incorrect mid calculation (same bug as BinarySearch). Line 136 has the same critical bug as BinarySearch: Apply this diff: for start != mid {
if target == arr[mid] {
return mid
}
if target < arr[mid] {
end = mid
- mid /= 2
+ mid = start + (end - start) / 2
} else {
start = mid
mid = mid + ((end - mid) / 2)
}
}🤖 Prompt for AI Agents |
||
|
|
||
| if mid == 0 { | ||
| return 0 | ||
| } else { | ||
| if(target < arr[mid]) { | ||
| return mid - 1 | ||
| } else { | ||
| return mid + 1 | ||
| } | ||
| } | ||
|
Comment on lines
+143
to
+151
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chainVerify the insertion position logic. The final adjustment returns Please verify this logic is correct for all edge cases, especially when mid > 0. Run the following test to verify the insertion position logic: 🏁 Script executed: #!/bin/bash
# Test FindInsertPosition with various edge cases
cat > test_insert.go << 'EOF'
package main
import "fmt"
func FindInsertPosition(arr []int, target int) int {
length := len(arr)
start := 0
end := length - 1
mid := end / 2
if length == 0 {
return 0
}
if target > arr[end] {
return end + 1
}
if target == arr[start] {
return start
}
if target == arr[end] {
return end
}
for start != mid {
if target == arr[mid] {
return mid
}
if target < arr[mid] {
end = mid
mid /= 2
} else {
start = mid
mid = mid + ((end - mid) / 2)
}
}
if mid == 0 {
return 0
} else {
if(target < arr[mid]) {
return mid - 1
} else {
return mid + 1
}
}
}
func main() {
testCases := []struct{
arr []int
target int
expected int
}{
{[]int{1,3,5,7,9}, 4, 2},
{[]int{1,3,5,7,9}, 6, 3},
{[]int{1,3,5,7,9}, 2, 1},
{[]int{1,3,5,7,9}, 0, 0},
{[]int{2,4,6,8}, 5, 2},
{[]int{10,20,30,40,50}, 25, 2},
}
for _, tc := range testCases {
result := FindInsertPosition(tc.arr, tc.target)
status := "✓"
if result != tc.expected {
status = "✗"
}
fmt.Printf("%s Insert %d in %v: got %d, expected %d\n",
status, tc.target, tc.arr, result, tc.expected)
}
}
EOF
go run test_insert.go
rm test_insert.goLength of output: 374 Fix insertion position return values at lines 147 and 149. The test confirms a bug: inserting 2 into 🤖 Prompt for AI Agents |
||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Critical: incorrect mid calculation breaks binary search.
Line 57 uses
mid /= 2when narrowing the search to the left half. This calculation ignores thestartposition and can causemidto fall belowstart, accessing elements outside the valid search range.Example: searching for 55 in [10, 20, 30, 40, 50, 60, 70, 80]:
Apply this diff:
for start != mid { if target == arr[mid] { return mid } if target < arr[mid] { end = mid - mid /= 2 + mid = start + (end - start) / 2 } else { start = mid mid = mid + ((end - mid) / 2) } }📝 Committable suggestion
🤖 Prompt for AI Agents