zoukankan      html  css  js  c++  java
  • [leetCode]剑指 Offer 57. 和为s的两个数字、II. 和为s的连续正数序列

    在这里插入图片描述

    解法 双指针

    由于数组是递增排序的所以可以设置两个指针,一个指向头部,一个指向尾部。两指针所指元素相加,若大于目标值则跳转尾部指针向前移动。若小于目标值则调整头部指针向后移动。

    class Solution {
        public int[] twoSum(int[] nums, int target) {
            if (nums == null || nums.length == 0) 
                return new int[]{};
            // 向前移动的指针
            int ahead = nums.length - 1;
            // 向后移动的指针
            int behind = 0;
            int[] ans = new int[2];
            while (ahead > behind) {
                int sum = nums[ahead] + nums[behind];
                if (sum == target) {
                    ans[0] = nums[behind];
                    ans[1] = nums[ahead];
                    return ans;
                } else if (sum > target) {
                    --ahead;
                } else {
                    ++behind;
                }
            }
            return new int[]{};
        }
    }
    

    剑指 Offer 57 - II. 和为s的连续正数序列

    在这里插入图片描述

    解法

    与上面解法类似,可以使用一个指针small先指向1,一个指针big指向2。将small~big之间的数字相加,如果其和sum等于目标值则将此序列添加到结果中,如果sum小于目标值则调整small指针,使其增大。目标和大于目标值则调整big指针使其减小。由于序列至少要有两个数字所以增加small到(target + 1)/2 为止。

    class Solution {
        public int[][] findContinuousSequence(int target) {
            if (target < 3) return new int[][]{};
            int small = 1;
            int big = 2;
            int middle = (target + 1) >> 1;
            int sum = small + big;
            List<int[]> ans = new LinkedList<>(); 
            while (small < middle) {
                if (sum == target) 
                    addOneAns(ans, small, big);
                while (sum > target && small < middle) {
                    sum -= small;
                    ++small;
                    if (sum == target) 
                        addOneAns(ans, small, big);
                }
                ++big;
                sum += big;
            }
            return ans.toArray(new int[ans.size()][]);
        }
        private void addOneAns(List<int[]> ans, int small, int big) {
            int[] row = new int[big - small + 1];
            for (int i = small; i <= big; ++i) {
                row[i - small] = i;
            }
            ans.add(row);
        }
    }
    
  • 相关阅读:
    AI 最小二乘法
    AI 前馈神经网络
    AI 雅可比(Jacobian)矩阵
    AI 递归神经网络(RNN)
    AI 循环神经网络(RNN)
    js操作地址栏
    JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
    php实现的三个常用加密解密功能函数示例
    php 获取URL 各部分参数
    PHP实现队列及队列原理
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13859931.html
Copyright © 2011-2022 走看看