《剑指offer》Java实现--判断数组中是否存在和为指定值的三个数

题目描述

    给定一个整数数组datas和一个整数sum,判断数组中是否存在三个数的和为sum,存在输出True,不存在则输出False。

解题思路

    最容易想到的解法就是三层循环遍历判断,暴力解法,时间复杂度为O(n^3)。这里我们改进下算法,算法思路对应伪代码如下:外部一层循环,内部头尾指针同时移动,时间复杂度为nlog(n)

for i in 0 to datas.length
  int j=i+1;
  int k=datas.length-1;
  int currentSum=dadas[i]+datas[j]+datas[k];
  while(currentSum!=sum&&j<k){
    if(currentSum<sum){
      currentSum=dadas[i]+datas[++j]+datas[k];
    }else if(currentSum>sum){
      currentSum=dadas[i]+datas[j]+datas[--k];
    }
    if(currentSum==sum) return "True"
  } 
return "False"

Java代码实现

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String[] lineStr=sc.nextLine().split(",");
        String[] numStrs=lineStr[0].split(" ");
        Integer[] nums=new Integer[numStrs.length];
        for(int i=0;i<numStrs.length;i++){
            nums[i]=Integer.valueOf(numStrs[i]);
        }
        Integer sum=Integer.valueOf(lineStr[1]);
        System.out.println(solution(nums, sum));
    }
    
//  public static String solution(Integer[] nums,int sum) {
//      String isExist="False";
//      for(int i=0;i<nums.length-2;i++){
//          for(int j=i+1;j<nums.length-1;j++){
//              for(int k=j+1;k<nums.length;k++){
//                  if(nums[i]+nums[j]+nums[k]==sum){
//                      isExist="True";
//                      break;
//                  }
//              }
//          }
//      }
//      return isExist;
//  }
    
    public static String solution(Integer[] nums,int sum) {
        String isExist="False";
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++){
            int index1=i+1;
            int index2=nums.length-1;
            int currentSum=nums[i]+nums[index1]+nums[index2];
            while(index1<index2&&currentSum!=sum){
                if(currentSum<sum){
                    currentSum=nums[i]+nums[++index1]+nums[index2];
                }else if (currentSum>sum) {
                    currentSum=nums[i]+nums[index1]+nums[--index2];
                }
                if(currentSum==sum){
                    isExist="True";
                    break;
                }
            }
        }
        return isExist;
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 2,990评论 0 1
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,403评论 0 2
  • 晨舞过的柳稍儿 刚刚挂上太阳 蝉还未醒,风正清凉 一只早起的蝴蝶贪恋着小溪 想亲吻水痕里粉红的霞朵儿 却把霞揉碎在...
    春衫凉阅读 955评论 2 16
  • 今天晚上,是我们第五天游泳了。今天,我们学会了换气。不知道大家会不会呢?
    巴黎的风520521阅读 167评论 0 0
  • 说走就走的旅行 我居然做到了 早上还在上班 下班之后就飞奔火车站 向着向往已久的西塘飞奔而来 果真 ...
    柯家菇凉阅读 256评论 1 1