力扣 搜索旋转排序数组-33
搜索旋转排序数组-33
class Solution {
public:
//二分法
int search(vector<int>& nums, int target) {
//计算数组大小
int n = nums.size();
//如果数组为空,直接返回-1
if(n == 0)return -1;
//如果数组中只有一个元素,判断是否与target相等,相等返回下标0,否则返回-1
if(n==1) return nums[n-1]==target?0:-1;
//左右边界
int l=0,r=n-1;
while(l<=r)
{
//中点
int mid = (l+r)/2;
//中间值与目标值相等,返回中间值的下标mid
if(target==nums[mid])return mid;
//如果左边是有序的(必须是<=不可以是<,否则只有两个值的时候会误判)
if(nums[l]<=nums[mid])
{
//目标值在左边,继续在左边查找
if(nums[l]<=target&&target<nums[mid])
{
r=mid-1;//移动右边界
}
//目标值在右边,继续在右边查找
else
l=mid+1;//移动左边界
}
//如果右边是有序的
else
{
//目标值在右边,继续在右边查找
if(nums[r]>=target&&target>nums[mid])
{
l=mid+1;//移动左边界
}
//目标值在左边,继续在左边查找
else
r=mid-1;//移动右边界
}
}
//数组全部遍历之后还没找到返回-1
return -1;
}
};
每日问题
C C++ 中volatile 关键字的作用是什么
volatile 关键字的作用
在 C/C++ 中,volatile 关键字用于修饰变量,告诉编译器该变量的值可能会在程序的控制之外发生变化。编译器在优化时会忽略 volatile 变量,以保证每次访问该变量时都从内存中读取,而不是从寄存器缓存中读取。这通常用于硬件寄存器、内存映射的输入输出端口、信号量或多线程环境中的共享变量等场景。
具体用途:
1.防止编译器优化:
编译器会假设程序中的变量在一个函数执行过程中不会发生意外的修改(除非显式写入)。但是在某些情况下,变量的值可能会被外部事件(如硬件中断、外部设备、并发线程等)改变。volatile 告诉编译器每次使用该变量时都必须从内存中读取其最新的值,而不能依赖于缓存或优化结果。
2.硬件寄存器:
例如,在嵌入式编程中,硬件寄存器的值可能随时被硬件外部因素更改,使用 volatile 可以避免编译器的优化。
3.信号处理和多线程共享数据:
在多线程编程中,多个线程可能共享同一变量。如果一个线程修改了该变量,另一个线程应该能够立即看到变化,使用 volatile 可以确保每次访问该变量时都会从内存中读取,而不是从寄存器中读取。
使用示例:
volatile int flag; // flag 可能被硬件或其他线程修改
void checkFlag() {
while (flag == 0) {
// 等待 flag 变为非零,防止编译器优化掉这个循环
}
// flag 已被修改,继续处理
}
const 关键字与 volatile 关键字的区别
const 和 volatile 都是 C/C++ 中常用的修饰符,它们有不同的含义和用途:
1.const关键字:
作用:const 用来修饰变量,表示该变量的值在程序中是不可修改的。也就是说,const 变量的值只能在初始化时赋值,之后不能再更改。
用途:常用于定义常量、函数参数传递、以及保护数据不被意外修改。
示例:
const int max_value = 100; // max_value 是常量,不能修改
max_value = 200; // 编译错误
volatile 关键字:
作用:volatile 告诉编译器某个变量的值可能会在程序的控制之外发生变化,防止编译器对该变量进行优化。
用途:常用于硬件寄存器、内存映射IO、信号量、线程共享变量等场景。
示例:
volatile int flag; // 该变量的值可能会被硬件或其他线程修改
volatile 与 const 的区别
总结:
volatile 用来告诉编译器:该变量的值可能会在程序外部发生变化,每次使用时都要从内存中读取,而不是缓存寄存器中的值。它与 线程同步、硬件寄存器、外部中断 等场景密切相关。
const 用来表示该变量是常量,程序中不允许修改它的值,主要用于定义常量、函数参数保护等场景。
结合使用的示例:
有时,const 和 volatile 也可以结合使用,例如,一个硬件寄存器的值是只读的,但它的值可能会被硬件外部因素改变。这时可以这样写:
const volatile int hardware_register; // 只读,但可能被硬件修改
这种情况下,const 表示该变量值不可被程序修改,而 volatile 表示该值可能会被硬件修改。