NC29 二维数组中的查找
1、解题思路
从左下方开始对比,比目标值大上移,否则右移。
2、代码
public class Solution {
public boolean Find(int target, int [][] array) {
if (array == null || array.length == 0 || array[0].length == 0) {
return false;
}
int row = array.length - 1;
int col = array[0].length - 1;
int r = array.length - 1;
int c = 0;
while (r >= 0 && c <= col) {
if (array[r][c] == target) {
return true;
} else if (array[r][c] > target) {
r--;
} else {
c++;
}
}
return false;
}
}
NC118 数组中的逆序对
1、解题思路
归并排序求逆序对。当放入左边元素的时候,计算一下右边元素有多少小于此元素。
2、代码
public class Solution {
private int sum = 0;
private final int mod = 1000000007;
private void mergeSort(int[] array, int left, int right) {
if (left >= right) {
return;
} else {
int mid = left + (right - left) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid + 1, right);
int[] temp = new int[right - left + 1];
int index = 0;
int l = left, r = mid + 1;
while (l <= mid || r <= right) {
if (r > right) {
temp[index++] = array[l++];
this.sum += (right - mid);
this.sum %= mod;
} else if (l > mid) {
temp[index++] = array[r++];
} else if (array[l] < array[r]) {
temp[index++] = array[l++];
this.sum += (r - mid - 1);
this.sum %= mod;
} else {
temp[index++] = array[r++];
}
}
for (int i = 0; i < temp.length; i++) {
array[left + i] = temp[i];
}
}
}
public int InversePairs(int[] array) {
mergeSort(array, 0, array.length - 1);
return sum;
}
}
NC120 二进制中1的个数
1、解题思路
与和移位操作
2、代码
public class Solution {
public int NumberOf1(int n) {
int ans = 0;
while (n != 0) {
if ((n & 1) == 1) {
ans++;
}
n>>>=1;
}
return ans;
}
}