zoukankan      html  css  js  c++  java
  • 剑指offer57 和为s的连续正数序列

    package com.example.lettcode.offer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @Class FindContinuousSequence
     * @Description 剑指offer57 和为s的连续正数序列
     * @Author 
     * @Date 2020/7/11
     **/
    public class FindContinuousSequence {    
    }
    
    /**
     * 解法1:暴力求解
     */
    public static int[][] findContinuousSequence(int target) {
    	List<List<Integer>> ans = new ArrayList<>();
    	int left = 1;
    	int middle = target / 2;
    	for (int i = left; i <= middle; i++) {
    		int sum = 0;
    		List<Integer> integerList = new ArrayList<>();
    		for (int j = i; j <= target; j++) {
    			sum += j;
    			integerList.add(j);
    			if (sum == target) {
    				ans.add(integerList);
    				break;
    			}
    			if (sum > target) break;
    		}
    	}
    	int[][] result = new int[ans.size()][];
    	for (int i = 0; i < ans.size(); i++) {
    		int len = ans.get(i).size();
    		result[i] = new int[len];
    		for (int j = 0; j <len; j++) {
    			result[i][j] = ans.get(i).get(j);
    		}
    	}
    
    	return result;
    }
    
    /**
     * 解法2:滑动窗口
     */
    public static int[][] findContinuousSequence(int target) {
    	int left = 1, right = 1;    // 滑动窗口的两个边界指针
    	int sum = 0;
    	int middle = target / 2;
    	List<int[]> res = new ArrayList<>();
    	while (left <= middle) {
    		if (sum < target) {
    			// 右边界右移
    			sum += right;
    			right++;
    		} else if (sum > target) {
    			// 左边界右移
    			sum -= left;
    			left++;
    		} else {
    			int[] temp = new int[right-left];
    			for (int i = left; i < right; i++) {
    				temp[i-left] = i;
    			}
    			res.add(temp);
    			// 左边界右移
    			sum-=left;
    			left++;
    		}
    	}
    	return res.toArray(new int[res.size()][]);
    }
    
    // 测试用例
    public static void main(String[] args) {
    	int target = 9;
    	int[][] ans = findContinuousSequence(target);
    	System.out.println("FindContinuousSequence demo01 result:");
    	for (int i = 0; i < ans.length; i++) {
    		for (int j = 0; j < ans[i].length; j++) {
    			System.out.print(" " + ans[i][j]);
    		}
    		System.out.println("");
    	}
    	System.out.println("");
    
    	target = 15;
    	ans = findContinuousSequence(target);
    	System.out.println("FindContinuousSequence demo02 result:");
    	for (int i = 0; i < ans.length; i++) {
    		for (int j = 0; j < ans[i].length; j++) {
    			System.out.print(" " + ans[i][j]);
    		}
    		System.out.println("");
    	}
    	System.out.println("");
    }
    
  • 相关阅读:
    java api 中的设计模式之组合(composite)
    Java api 中设计模式之适配器模式(Adapter)
    win 7 C盘清理
    centos 与 redhat 以及 mysql 与 Oracle
    tsung生成报表时报错
    对MySQL的死连接Sleep的进程的来源研究[转]
    商派ecstore后台配置微信支付应该注意的问题
    商派crm的内存计算组件配置mysql5.6的问题
    php-curl无法编译
    ecstore目录系统预占字符
  • 原文地址:https://www.cnblogs.com/fyusac/p/13283933.html
Copyright © 2011-2022 走看看