59人参与 • 2024-08-06 • 算法
class solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length-1;
while(left <= right){
int mid = left + (right-left)/2;
if (target < nums[mid]){
right = mid - 1;
}else if(target > nums[mid]){
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
}
[注意事项]
(left+right)/2
,而是使用left+(right-left)/2
的形式.//首先定义left和right指针
while (left <= right){
int mid = left+(right-left)/2;
if(...) left = mid+1;
else if(...) right = mid-1;
else return ...;
}
class solution {
public int[] searchrange(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int[] array = new int[2];
array[0] = -1;
array[1] = -1;
if (nums.length == 0){//注意处理特殊情况
return array;
}
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;//left下标不可能是t的值
} else {
right = mid;//right下标有可能是t的值
}
}
if (nums[left] == target){
array[0] = left;
}else{
return array;
}
left = 0;
right = nums.length - 1;
while (left < right) {
int mid = left + (right - left + 1) / 2;
if (nums[mid] > target) {
right = mid - 1; //right下标不可能是t的值
} else {
left = mid;//left下标可能是t的值
}
}
array[1] = right;
return array;
}
}
while(left < right){
int mid = left+(right-left)/2;
if(...) left = mid+1;
else right = mid;
}
while(left < right){
int mid = left+(right-left+1)/2;
if(...) left = mid;
else right = mid-1;
}
class solution {
public int searchinsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
if (nums[right] < target) {
return right + 1;
}
return right;
}
}
class solution {
public int mysqrt(int x) {
if (x < 1){
return 0;
}
long left = 1;
long right = x;
while(left < right){
long mid = left + (right - left + 1)/2;//由于是向下取整,所以要加1
if (mid * mid <= x){
left = mid;
}else{
right = mid - 1;
}
}
return (int)left;
}
}
[注意] 我们这里使用long,防止数据溢出.
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论