左程云算法学习(个人笔记)C++版1.认识复杂度、位运算、局部最小值(二分)

本文介绍了C++中的位运算,包括异或操作,以及如何使用位运算取最后一个非零数。同时展示了如何解决局部最小值问题,特别提到了不需要数据有序的二分查找方法。
摘要由CSDN通过智能技术生成

问题1:

#include <cstdio>
#include <cmath>
#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;

void xulie(int n,int arr[]){
    
    int res=0,res1=0;
    for(int i=0;i<n;i++){//所有数异或,此时偶数消为0,res为两个奇数异或的结果
        res=res^arr[i];
    }

    
    //提取最右边的1
    int rightOne=res&(~res+1);
    //只将指定位数有1的数据进行异或(对于偶数个数的数据依然消为0,而对于奇数个数的数只会选到其中一个,这样res1最后就是其中的一个奇数了)
    for(int j=0;j<10;j++){
        
        if((arr[j]&rightOne)==rightOne){
            res1=res1^arr[j];
        }
    }

    cout<<"a="<<res1<<",b="<<(res1^res);
}
int main() {
    int n;
    int arr[100];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }

    xulie(n,arr);
}

这题有点好玩,学习了①.位运算的(与)和(异或)

②.如何取最后一位非零数

问题2::局部最小值问题(给出一串数据,找到其中的一个局部最小值)

这题有点意思,不一定有序才能有二分


#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
 
int  binary(vector<int> arr,int left,int right){
    
    int mid=(left+right)/2;
       
            while(1){
                if(arr[mid-1]>=arr[mid]&&arr[mid+1]>=arr[mid])//如果局部最优
                return mid;
                else if(arr[mid-1]<arr[mid]){//如果左边小,往左边走
                    right=mid;
                    mid=(left+mid)>>1;
                }else if(arr[mid+1]<arr[mid]){//如果右边小,往右边走
                    left=mid;
                      mid=(right+mid)>>1;
                }
 
            }
}
int main() {
    int n;
    cin>>n;
    int temp;
   vector<int> arr;
    for(int i=0;i<n;i++){
        cin>>temp;
        arr.push_back(temp);
    }
    if(arr[0]<=arr[1])//端点处理
      cout<< 0;
    else if(arr[n-1]<=arr[n-2])
        cout<<(n-1);
    else{cout<<binary(arr,0,n-1);}//二分查找
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值