二维数组中的查找&&数组中的逆序对&&二进制中1的个数

199 阅读1分钟

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;
    }
}