mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 14:18:20 +08:00 
			
		
		
		
	* create RUBY searching files & finish two_sum.rb * finish linear_search.rb * finish hashing_search.rb * finish binary_search.rb * finish binary_search_insertion.rb * finish binary_search_edge.rb * fix: change 'or' to '||' * fix: Adjust the code style(ruby searching) * fix: repair file name * fix: Adjust the output format * fix: fix 0...nums.length & delete useless require & change into __FILE__==0 block
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
=begin
 | 
						||
File: binary_search_edge.rb
 | 
						||
Created Time: 2024-04-09
 | 
						||
Author: Blue Bean (lonnnnnnner@gmail.com)
 | 
						||
=end
 | 
						||
 | 
						||
require_relative './binary_search_insertion'
 | 
						||
 | 
						||
### 二分查找最左一个 target ###
 | 
						||
def binary_search_left_edge(nums, target)
 | 
						||
  # 等价于查找 target 的插入点
 | 
						||
  i = binary_search_insertion(nums, target)
 | 
						||
 | 
						||
  # 未找到 target ,返回 -1
 | 
						||
  return -1 if i == nums.length || nums[i] != target
 | 
						||
 | 
						||
  i # 找到 target ,返回索引 i
 | 
						||
end
 | 
						||
 | 
						||
### 二分查找最右一个 target ###
 | 
						||
def binary_search_right_edge(nums, target)
 | 
						||
  # 转化为查找最左一个 target + 1
 | 
						||
  i = binary_search_insertion(nums, target + 1)
 | 
						||
 | 
						||
  # j 指向最右一个 target ,i 指向首个大于 target 的元素
 | 
						||
  j = i - 1
 | 
						||
 | 
						||
  # 未找到 target ,返回 -1
 | 
						||
  return -1 if j == -1 || nums[j] != target
 | 
						||
 | 
						||
  j # 找到 target ,返回索引 j
 | 
						||
end
 | 
						||
 | 
						||
### Driver Code ###
 | 
						||
if __FILE__ == $0
 | 
						||
  # 包含重复元素的数组
 | 
						||
  nums = [1, 3, 6, 6, 6, 6, 6, 10, 12, 15]
 | 
						||
  puts "\n数组 nums = #{nums}"
 | 
						||
 | 
						||
  # 二分查找左边界和右边界
 | 
						||
  for target in [6, 7]
 | 
						||
    index = binary_search_left_edge(nums, target)
 | 
						||
    puts "最左一个元素 #{target} 的索引为 #{index}"
 | 
						||
    index = binary_search_right_edge(nums, target)
 | 
						||
    puts "最右一个元素 #{target} 的索引为 #{index}"
 | 
						||
  end
 | 
						||
end
 |