算法day01

78 阅读2分钟

1.异或运算

 1.数组中只有一个元素出现了奇数次,其他元素都出现了偶数次
 2.数组中有两个元素出现了奇数次,其他元素都出现了偶数次:
 思想:将数组中所有元素进行异或运算得到target=a^b(ab指代出现了奇数次的元素),
 因为a!=b,所以ab在某一位上必然不相同,假设target第8位的元素为1,则说明在
 第8位上ab是不相同的;此时可以将所有元素分为两个集合,集合1:第8位上为1的所
 有元素,集合2:第8位上为0的所有元素;假设a属于集合1那么b一定属于集合2,集合1除
 去a以外所有元素均出现了两次,此时如果将0和集合1逐项异或最终得到的就是a,将0与
 集合2逐项异或则得到b;使用lastRightOne=target^(~target+1)可以提取target最后
 的1假设这个1在第i位,将数组中的元素逐个和lastRightOne异或,若结果为1说明该元素
 第i位为0,在此条件下将元素逐个和0异或就得到了res1=a或者b。最终res1^res就得到了另外一个。
 

2.简单排序

1.插入排序:一共N-1轮,每次从i到N-1范围内找出最小值与第i位交换。
2.冒泡排序:一共N-1轮,每次从0到N-i范围内进行,循环比较第i-1和第i位,
如果arr[i-1]>arr[i],则交换
3.选择排序:一共N-1轮,每次从0i内进行,第i位向前比较,比arr[i]大
就交换,遇到第一个比arr[i]小的就停止该轮。

3.二分拓展。

1.寻找>=num最左侧的位置或者<=num最右侧的位置:二分算法进行到底,返回mid的值
2.局部最小值:数组两端nums[0]<nums[1],nums[n]<nums[n-1]满足
局部最小。数组中间nums[i-1]>nums[i]<nums[i+1]满足局部最小。
给定一个相邻元素不重复的数组,返回一个满足局部最小条件的元素
下标。
先判断两端,如果都不满足则中间必定存在至少一个局部最小值,此时
二分判断nums[mid]是否满足局部最小值,如果不满足再次判断,
(nums[mid+1]<nums[mid]<nums[mid-1])或者(nums[mid+1]>nums[mid>nums[mid-1])或者(nums[mid]>nums[mid-1]&&nums[mid]>nums[mid+1])中必然满足其中一个。
(nums[mid+1]<nums[mid]<nums[mid-1])向右二分,
(nums[mid+1]>nums[mid>nums[mid-1])向左二分,
(nums[mid]>nums[mid-1]&&nums[mid]>nums[mid+1])向左或者向右都可以,自己定义。
如此循环直到找到满足局部最小条件的值