【Java学习】1 数组、字典

Leetcode 两数之和 相关知识点

引言

从这篇博客开始正式用Java语言刷题,题目均是Leetcode上面用python语言曾刷过的简单题。一方面巩固算法,另一方面尽快掌握Java语言的用法。
博文最后会附上A过的代码,欢迎沟通指正。

题目

1. 两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

知识点

Java 数组

Java中的数组用来存储固定大小的同类型数据。比如num[10]表示声明了10个独立变量num0,num1,…,num9。
下面首先介绍数组的声明、创建和初始化过程。再介绍一下多维数组和Array类的用法。

声明数组变量

数组需要先声明,才能在程序中使用。声明如下,其中dataType代表数据类型,arrayRefVar维数组变量名。

dataType[] arrayRefVar;      //首选的方法
或
dataType arrayRefVar[];       //效果相同,但不首选
创建数组

Java用new操作符来创建数组。其中arraySize为数组长度,数组元素下标从0开始。

dataType[] arrayRefVar = new dataType[arraySize];   //创建数组,并将数组的引用赋值给变量arrayRefVar 
初始化数组
  • 创建数组时就初始化数组
double[] myList = new double[4]{1.2, 3.4, 2.5, 7.9}
  • 通过循环逐个给数组的元素赋值
double[] myList;
for(int i=0; i<myList.length; i++){
	myList[i] = i;
}
多维数组

多为数组可以看成数组的数组,比如二维数组可以看成多个一维数组组成的数组。

String str[][] = new String[3][4];

多维数组的初始化有两种:

  1. 静态初始化:在声明数组的同时初始化
int[] arr = new int[]{1,2,3};
  1. 动态初始化:在声明数组之后,再进行初始化
String[] strArr = new String[3];
strArr[0] = "Hello";
strArr[1] = "World";
strArr[2] = "Hello World";

多维数组分配空间的方式有两种:

  1. 直接为每一维分配空间,格式如下
int a[][] = new int[2][3];
  1. 从最高维开始,逐维分配空间
String s[][] = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
Arrays类

java.util.Array类能方便地操作数组,它提供的方法都是静态的。具有fill,sort,equals,binarySearch等方法,具体如下:

  • boolean equals(array1, array2):比较两个数组是否相等
boolean flag = Array.equal(str1, str2);    //返回true或false
  • void sort(array):对数组array元素进行升序排列
Array.sort(score);      //score变成升序排列的数组
  • String toString(array):把数组转换为一个字符串。直接打印array,出来的时hashcode码,因此要输出数组内容需要转化为字符串再打印
String str = Array.toString(score);      
  • void fill(array, val):将数组中所有元素赋值为val
Array.fill(num, 6);        //数组num每个元素值均变为6
  • int binarySearch(array, val):利用二分查找,查找值val在数组array中的下标。数组必须是有序数列,若本无序则需要先借助sort函数排序,再二分查找
int key = Arrays.binarySearch(num, 3);   //二分查找3在数组num中的位置
  • dataType[] copyOf(array, length):把数组array复制为一个长度为length的新数组
dataType[] b = Arrays.copyOf(a, a.length);     //参数1:原数组  参数2:新数组的长度

Java Map接口

Java中不再有字典的概念,一般都是用Map来实现键对值的功能。
Map接口中键和值一一映射,可以通过键来获取值。Map的声明创建方式:Map<Object1, Object2 > mapName = new HashMap<Object1, Object2>()。Map的方法有以下几种:

  • void clear():移除所有映射关系
mapName.clear();
  • boolean containsKey(Object k):如果map(映射)中包含键k的映射关系,则返回true。
  • boolean containValue(Object v):如果map中存在一个或多个键值映射到值v,则返回true。
  • Set entrySet():将map(映射)中所有的映射关系加入到Set视图中。
  • boolean equals(Object obj):比较指定对象与map是否相等。这个对象可能不是map,也可能原映射的size不同,只有当map与obj每个数据元素均相同时,才返回true。
  • Object get(Object k):返回指定键所映射的值;如果map不含该键的映射关系,则返回mull。
  • int hashCode():返回此映射的哈希码值。
  • boolean isEmpty():如果此映射未包含键-值的映射关系,则返回null。
  • Set keySet():返回此映射中所有键的Set视图。
  • Object put(Object k, Object v):在map中加入新的k-v键对值。
  • void putAll(Map m):将映射m中的所有映射关系复制到此映射中。
  • Object remove(Object k):如果存在键k的映射关系,则将其从映射中移除。
  • int size():返回map(映射)中的键-值关系数。
  • Collection values():返回此映射中包含的值的Collection视图。

解法

从题目可知,欲求两数之和,已有目标值target。要想降低算法复杂度,减少数组的遍历次数,需要借助一个很重要的工具——Map。
对于当前遍历数据b来说,只要之前已遍历的数据中存在一个数a,满足a+b=target,则遍历结束。由于返回的是a,b的位置,所以需要使用Map来存储已遍历数据的值(作为key)与位置(作为value)。

  • 算法复杂度:O(n)
  • Solution:
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(Integer i=0;i<nums.length;i++){
            int re = target-nums[i];
            if(map.containsKey(re) == true){
                return new int[]{map.get(re),i};
            }
            else{
                map.put(nums[i],i);
            }
        }
        return null;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值