二分查找过程中会使用求中间值
int mid = (left + right) / 2;
int mid = left + (right - left) / 2;
- `int mid = left + ((right - left) >> 1);
推荐使用第二或者第三种方式,可以避免right+left
结果溢出int
范围。
二分查找每次都是将区间的中间结点与val进行比较,当区间长度为奇数时,int mid = (left + right) / 2
自然就是中间的结点
但是如果区间为偶数的时候,中间结点有两个,上面的查询就会是左半边的最后一个结点,而使用int mid = left + (right - left + 1) / 2;
就可以查询右半区间第一个结点。
//记录是否出现
boolean[] vis = new boolean[26];
//记录出现几次
int[] vis = new int[26];
//记录最后一次出现的下标是那个
int[] vis = new int[26];
for(int i = 0;i < s.length();i++){
vis[s.charAt(i) - 'a'] = i;
}
只对两个数进行加减,让两个数变成原来的负数
/**
* x y
* x - y y
* x - y x
* -y x
* -y -x x
* -y -x -y
* -x -y
*/