zoukankan      html  css  js  c++  java
  • 九章强化最后一章

    1 Find Peak Element

        public int findPeak(int[] a) {
            // write your code here
            if (a == null || a.length <= 2) return -1;
            int start = 0;
            int end = a.length - 1;
            int mid;
            while (start < end) {
                mid = start + (end - start) / 2;
                if (a[mid] < a[mid + 1]){
                    start = mid + 1;
                } else {
                    end = mid;
                }
            }
            return start;
        }
    View Code

    2 子数组之和0

    一个整数矩阵有如下一些特性:
    
    相邻的整数都是不同的
    矩阵有 n 行 m 列。
    对于所有的 i < m, 都有 A[0][i] < A[1][i] && A[n - 2][i] > A[n - 1][i].
    对于所有的 j < n, 都有 A[j][0] < A[j][1] && A[j][m - 2] > A[j][m - 1].
    我们定义一个位置 P 是一个峰,如果有 A[j][i] > A[j+1][i] && A[j][i] > A[j-1][i] && A[j][i] > A[j][i+1] && A[j][i] > A[j][i-1]。
    
    找出该矩阵的一个峰值元素,返回他的坐标。
    
     注意事项
    
    可能会存在多个峰值,返回任意一个即可。
    
    您在真实的面试中是否遇到过这个题? Yes
    样例
    给一个矩阵:
    
    [
      [1 ,2 ,3 ,4 ,5],
      [16,41,23,22,6],
      [15,17,24,21,7],
      [14,18,19,20,8],
      [13,12,11,10,9]
    ]
    返回 41 的坐标[1,1], 或者 24 的坐标[2,2
        public ArrayList<Integer> subarraySum(int[] nums) {
            // write your code here
            ArrayList<Integer> res = new ArrayList<>();
            HashMap<Integer, Integer> map = new HashMap<>();
            map.put(0, -1);
            int sum = 0;
            for (int i = 0; i < nums.length; i++) {
                sum += nums[i];
                if (map.containsKey(sum)) {
                    res.add(map.get(sum) + 1);
                    res.add(i);
                    return res;
                }
                map.put(sum, i);
            }
            return res;
        }
    View Code

    3 Submatrix Sum

     public int[][] submatrixSum(int[][] matrix) {
            int[][] result = new int[2][2];
            int M = matrix.length;
            if (M == 0) return result;
            int N = matrix[0].length;
            if (N == 0) return result;
            // pre-compute: sum[i][j] = sum of submatrix [(0, 0), (i, j)]
            int[][] sum = new int[M+1][N+1];
            for (int j=0; j<=N; ++j) sum[0][j] = 0;
            for (int i=1; i<=M; ++i) sum[i][0] = 0;
            for (int i=0; i<M; ++i) {
                for (int j=0; j<N; ++j)
                    sum[i+1][j+1] = matrix[i][j] + sum[i+1][j] + sum[i][j+1] - sum[i][j];
            }
            for (int l=0; l<M; ++l) {
                for (int h=l+1; h<=M; ++h) {
                    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
                    for (int j=0; j<=N; ++j) {
                        int diff = sum[h][j] - sum[l][j];
                        if (map.containsKey(diff)) {
                            int k = map.get(diff);
                            result[0][0] = l;   result[0][1] = k;
                            result[1][0] = h-1; result[1][1] = j-1;
                            return result;
                        } else {
                            map.put(diff, j);
                        }
                    }
                }
            }
            return result;
        }
    View Code
  • 相关阅读:
    GCD
    Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
    systimestamp
    byte数组之间的赋值,byte和TCHAR数组的赋值
    如何修改hotspot默认信道
    Wifi的密码长度有何限制
    微信心跳机制
    如何内置iperf到手机中
    如何adb shell进入ctia模式
    本周推荐10款免费的网站模板设计
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7466249.html
Copyright © 2011-2022 走看看