springboot基础(80):redis geospatial的应用

文章目录

  • 前言
  • redis geospatial
  • 如何从地图上获取经纬度
  • springboot 的相关方法调用
    • 准备redis服务器
    • 引用的依赖
    • 预设位置的key
    • GEOADD 添加位置
    • GEORADIUS 获取指定经纬度附件的停车场(deprecated)
    • GEORADIUS 获取指定成员附件的停车场(deprecated)
    • GEOSEARCH 搜索指定经纬度附件的停车场
    • GEOSEARCH 搜索指定成员附件的停车场
    • GEOPOS获取指定成员经纬度
    • GEODIST获取两点之间的距离
    • GEOHASH获取坐标的hash
    • ZREM 移除位置
  • 数学球面计算两点距离

前言

基于redis geospatial的应用比较广泛,比如需要获取附件5公里的停车场。

官方文档:https://redis.io/docs/data-types/geospatial/

代码已分享至Gitee:https://gitee.com/lengcz/redisgeo

redis geospatial

用于地理位置服务的计算,它能做哪些?

  • 我周边的共享单车的信息,可以按距离输出
  • 两坐标、车辆之间的距离

如何从地图上获取经纬度

高德地图:
https://lbs.amap.com/demo/javascript-api/example/map/click-to-get-lnglat/

百度地图:
https://api.map.baidu.com/lbsapi/getpoint/index.html

springboot 的相关方法调用

准备redis服务器

需要安装redis 服务器

引用的依赖

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>

注意本demo中的springboot版本为2.7.15,如果你的版本较低,可能部分GEOSEARCH 的API不可用。
如果遇到demo中的示例出现报红,请考虑是否为依赖版本过低。

预设位置的key

private String positionKey = "parking";

GEOADD 添加位置

官方文档: https://redis.io/commands/geoadd/

GEOADD key [NX | XX] [CH] longitude latitude member [longitudelatitude member ...]

注意经纬度需要在范围内

  • 经度 -180到180
  • 纬度 -85.05112878到85.05112878

如果你添加的经纬度超出范围会报错

XX: 仅更新已存在的元素。永远不要添加元素。
NX:不要更新已经存在的元素。始终添加新元素。
CH:将返回值从添加的新元素数量修改为更改的元素总数(CH是changed的缩写)。已更改的图元是添加的新元素和已更新坐标的现有图元。因此,命令行中指定的分数与过去相同的元素将不被计算在内。注意:通常情况下,GEOADD的返回值只计算添加的新元素数量。

 @Testvoid geoAdd(@Autowired RedisTemplate redisTemplate) {System.out.println("--------添加位置-----");GeoOperations geoOperations = redisTemplate.opsForGeo();{Long addedNum = geoOperations.add(positionKey, new Point(-122.27652, 37.805186), "10001:市图书馆");System.out.println(addedNum);}{Long addedNum = geoOperations.add(positionKey, new Point(-122.2674626, 37.8062344), "10002:百货大楼");System.out.println(addedNum);}{Long addedNum = geoOperations.add(positionKey, new Point(-122.2469854, 37.8104049), "10003:科学中心");System.out.println(addedNum);}{Long addedNum = geoOperations.add(positionKey, new Point(-122.2625112, 37.793513), "10004:博物馆");System.out.println(addedNum);}System.out.println("--------添加位置END-----");}

GEORADIUS 获取指定经纬度附件的停车场(deprecated)

官方文档: https://redis.io/commands/georadius/

从Redis版本6.2.0开始,此命令被视为已弃用。
在迁移或编写新代码时,可以用带有BYRADIUS参数的GEOSEARCH和GEOSEARCHSTORE替换它。

GEORADIUS key longitude latitude radius <M | KM | FT | MI>[WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC][STORE key | STOREDIST key]

单位

  • m 米
  • km 千米
  • mi 英里
  • ft 英尺
  @Testvoid geoRadius(@Autowired RedisTemplate redisTemplate) {// 指定经纬度附近5公里的停车场Circle circle = new Circle(new Point(-122.2612767, 37.793684), RedisGeoCommands.DistanceUnit.KILOMETERS.getMultiplier());RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeCoordinates().includeDistance().sortAscending().limit(5);GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo().radius(positionKey, circle, args);System.out.println(results);for (GeoResult<RedisGeoCommands.GeoLocation<String>> g : results) {System.out.println(g);String addr = g.getContent().getName();System.out.println("addr:" + addr + ",distance:" + g.getDistance().getValue());}}

运行结果

GeoResult [content: RedisGeoCommands.GeoLocation(name=10004:博物馆, point=Point [x=-122.262509, y=37.793512]), distance: 109.9417 METERS, ]
addr:10004:博物馆,distance:109.9417
GeoResult [content: RedisGeoCommands.GeoLocation(name=10002:百货大楼, point=Point [x=-122.267460, y=37.806234]), distance: 1497.9608 METERS, ]
addr:10002:百货大楼,distance:1497.9608
GeoResult [content: RedisGeoCommands.GeoLocation(name=10001:市图书馆, point=Point [x=-122.276520, y=37.805185]), distance: 1852.3499 METERS, ]
addr:10001:市图书馆,distance:1852.3499
GeoResult [content: RedisGeoCommands.GeoLocation(name=10003:科学中心, point=Point [x=-122.246984, y=37.810404]), distance: 2244.1523 METERS, ]
addr:10003:科学中心,distance:2244.1523

GEORADIUS 获取指定成员附件的停车场(deprecated)

 @Testvoid geoRadius2(@Autowired RedisTemplate redisTemplate) {// 指定地址附近5公里的停车场RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeCoordinates().includeDistance().sortAscending().limit(5);GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo().radius(positionKey, "10001:市图书馆", new Distance(5, Metrics.KILOMETERS), args);System.out.println(results);for (GeoResult<RedisGeoCommands.GeoLocation<String>> g : results) {System.out.println(g);String addr = g.getContent().getName();System.out.println("addr:" + addr + ",distance:" + g.getDistance().getValue());}}

执行结果

GeoResult [content: RedisGeoCommands.GeoLocation(name=10001:市图书馆, point=Point [x=-122.276520, y=37.805185]), distance: 0.0 KILOMETERS, ]
addr:10001:市图书馆,distance:0.0
GeoResult [content: RedisGeoCommands.GeoLocation(name=10002:百货大楼, point=Point [x=-122.267460, y=37.806234]), distance: 0.8047 KILOMETERS, ]
addr:10002:百货大楼,distance:0.8047
GeoResult [content: RedisGeoCommands.GeoLocation(name=10004:博物馆, point=Point [x=-122.262509, y=37.793512]), distance: 1.7894 KILOMETERS, ]
addr:10004:博物馆,distance:1.7894
GeoResult [content: RedisGeoCommands.GeoLocation(name=10003:科学中心, point=Point [x=-122.246984, y=37.810404]), distance: 2.6597 KILOMETERS, ]
addr:10003:科学中心,distance:2.6597

GEOSEARCH 搜索指定经纬度附件的停车场

官方文档: https://redis.io/commands/geosearch/

注意该命令从redis 6.0.2开始。

GEOSEARCH key <FROMMEMBER member | FROMLONLAT longitude latitude><BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM |FT | MI>> [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST][WITHHASH]
    @Testvoid geoSearch(@Autowired RedisTemplate redisTemplate) {// 指定经纬度附近5公里的停车场RedisGeoCommands.GeoSearchCommandArgs geoSearchCommandArgs = RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeCoordinates().includeDistance().sortAscending();GeoResults<RedisGeoCommands.GeoLocation> searchResult = redisTemplate.opsForGeo().search(positionKey, new GeoReference.GeoCoordinateReference(-122.2612767, 37.793684), new Distance(5, Metrics.KILOMETERS), geoSearchCommandArgs);
//        System.out.println(searchResult);List<GeoResult<RedisGeoCommands.GeoLocation>> content = searchResult.getContent();for (GeoResult<RedisGeoCommands.GeoLocation> g : content) {
//            System.out.println(g);RedisGeoCommands.GeoLocation content1 = g.getContent();Distance distance = g.getDistance();System.out.println("content1:" + content1 + ",distance:" + distance);}}

执行结果

content1:RedisGeoCommands.GeoLocation(name=10004:博物馆, point=Point [x=-122.262509, y=37.793512]),distance:0.1099 KILOMETERS
content1:RedisGeoCommands.GeoLocation(name=10001:市图书馆, point=Point [x=-122.276520, y=37.805185]),distance:1.8523 KILOMETERS
content1:RedisGeoCommands.GeoLocation(name=10003:科学中心, point=Point [x=-122.246984, y=37.810404]),distance:2.2442 KILOMETERS

GEOSEARCH 搜索指定成员附件的停车场

 @Testvoid geoSearch2(@Autowired RedisTemplate redisTemplate) {// 指定成员附近5公里的停车场RedisGeoCommands.GeoSearchCommandArgs geoSearchCommandArgs = RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().includeCoordinates().includeDistance().sortAscending();GeoResults<RedisGeoCommands.GeoLocation> searchResult = redisTemplate.opsForGeo().search(positionKey, new GeoReference.GeoMemberReference<>("10004:博物馆"), new Distance(5, Metrics.KILOMETERS), geoSearchCommandArgs);
//        System.out.println(searchResult);List<GeoResult<RedisGeoCommands.GeoLocation>> content = searchResult.getContent();for (GeoResult<RedisGeoCommands.GeoLocation> g : content) {
//            System.out.println(g);RedisGeoCommands.GeoLocation content1 = g.getContent();Distance distance = g.getDistance();System.out.println("content1:" + content1 + ",distance:" + distance);}}

执行结果

content1:RedisGeoCommands.GeoLocation(name=10004:博物馆, point=Point [x=-122.262509, y=37.793512]),distance:0.0 KILOMETERS
content1:RedisGeoCommands.GeoLocation(name=10001:市图书馆, point=Point [x=-122.276520, y=37.805185]),distance:1.7894 KILOMETERS
content1:RedisGeoCommands.GeoLocation(name=10003:科学中心, point=Point [x=-122.246984, y=37.810404]),distance:2.3219 KILOMETERS

GEOPOS获取指定成员经纬度

官方文档 https://redis.io/commands/geopos/

GEOPOS key [member [member ...]]
    @Testvoid geoGetPoints(@Autowired RedisTemplate redisTemplate) {List<Point> points = redisTemplate.opsForGeo().position(positionKey, "10003:科学中心", "10004:博物馆");System.out.println(points);}

执行结果

[Point [x=-122.246984, y=37.810404], Point [x=-122.262509, y=37.793512]]

GEODIST获取两点之间的距离

官方文档: https://redis.io/commands/geodist/

命令

GEODIST key member1 member2 [M | KM | FT | MI]

单位

  • m 米
  • km 千米
  • mi 英里
  • ft 英尺
    @Testpublic void testDist(@Autowired RedisTemplate redisTemplate) {Distance distance = redisTemplate.opsForGeo().distance(positionKey, "10003:科学中心", "10004:博物馆", RedisGeoCommands.DistanceUnit.KILOMETERS);System.out.println(distance);}

执行结果

2.3219 KILOMETERS

GEOHASH获取坐标的hash

官方文档: https://redis.io/commands/geohash/

GEOHASH key [member [member ...]]

这里给定的10005不存在

    @Testpublic void testGeoHash(@Autowired RedisTemplate redisTemplate) {List<String> results = redisTemplate.opsForGeo().hash(positionKey, "10004:博物馆", "10002:百货大楼", "10005:欢乐海岸");System.out.println(results);}

执行结果

[9q9p1b55jj0, 9q9p1drt380, null]

ZREM 移除位置

官方没有GEODEL,需要使用ZREM命令

官方文档: https://redis.io/commands/zrem/

 @Testpublic void testGeoRemove(@Autowired RedisTemplate redisTemplate) {Long remove = redisTemplate.opsForGeo().remove(positionKey, "10002:百货大楼");List<String> results = redisTemplate.opsForGeo().hash(positionKey, "10004:博物馆", "10002:百货大楼", "10005:欢乐海岸");System.out.println(results);}

执行结果,可以看到10002百货大楼已经被移除了。

[9q9p1b55jj0, null, null]

注意: redis geo没有GEODEL命令,需要使用ZREM命令删除元素

数学球面计算两点距离

/*** 通过球面计算距离*/
public class DistanceUtil {/*** 赤道半径(m)*/public final static double RC = 6378137;/*** 极半径(m)*/public final static double RJ = 6356725;/*** 将角度转化为弧度*/public static double radians(double d) {return d * Math.PI / 180.0;}/*** 根据两点经纬度((longitude and latitude))坐标计算直线距离* <p>* S = 2arcsin√sin²(a/2)+cos(lat1)*cos(lat2)*sin²(b/2) ̄*6378137* <p>* 1. lng1 lat1 表示A点经纬度,lng2 lat2 表示B点经纬度;<br>* 2. a=lat1 – lat2 为两点纬度之差 b=lng1 -lng2 为两点经度之差;<br>* 3. 6378137为地球赤道半径,单位为米;** @param longitude1 点1经度* @param latitude1  点1纬度* @param longitude2 点2经度* @param latitude2  点2纬度* @return 距离,单位米(M)* @see <a href=* "https://zh.wikipedia.org/wiki/%E5%8D%8A%E6%AD%A3%E7%9F%A2%E5%85%AC%E5%BC%8F">* 半正矢(Haversine)公式</a>*/public static double getDistanceFromToLngLat(double longitude1, double latitude1, double longitude2, double latitude2) {// 将角度转化为弧度double radLongitude1 = radians(longitude1);double radLatitude1 = radians(latitude1);double radLongitude2 = radians(longitude2);double radLatitude2 = radians(latitude2);double a = radLatitude1 - radLatitude2;double b = radLongitude1 - radLongitude2;return 2 * Math.asin(Math.sqrt(Math.sin(a / 2) * Math.sin(a / 2)+ Math.cos(radLatitude1) * Math.cos(radLatitude2) * Math.sin(b / 2) * Math.sin(b / 2))) * (RC);}/*** 获取指定角度方向上的经纬度(longitude and latitude)<br>* 以原始点的经纬度为基点,构建XY二维坐标线,则angle角度则从x轴起算。<br>* 说明:LBS查找,东西南北四个方向的最远点,构建矩形,在矩形框方位内, 才有可能是该距离方位内的坐标,然后利用距离公式从小范围内找坐标** @param origLongitude    基点经度* @param origLatitude     基点纬度* @param distance         距离(m)* @param angle            角度(0~360)* @param 经纬度(该角度指定距离的经纬度)*/public static Coordinate getCoordinate(double origLongitude, double origLatitude, double distance, double angle) {double x = distance * Math.sin(angle * Math.PI / 180.0);double y = distance * Math.cos(angle * Math.PI / 180.0);double r = RJ + (RC - RJ) * (90.0 - origLongitude) / 90.0;//由于地球不是标准的球体,中间粗,两头细,这里計算平均半徑rdouble d = r * Math.cos(origLongitude * Math.PI / 180);double newLongitude = (y / r + origLongitude * Math.PI / 180.0) * 180.0 / Math.PI;double newLatitude = (x / d + origLatitude * Math.PI / 180.0) * 180.0 / Math.PI;return new Coordinate(newLongitude, newLatitude);}
}

测试用例,用例的经纬度为GEOSEARCH示例中目标到科学中心的距离

  @Testvoid getDist() {double longitude1 = -122.2612767;double latitude1 = 37.793684;double longitude2 = -122.2469854;double latitude2 = 37.8104049;double distance = DistanceUtil.getDistanceFromToLngLat(longitude1, latitude1, longitude2, latitude2);System.out.println("经纬度(" + longitude1 + "," + latitude1 + ")到(" + longitude2 + "," + latitude2 + ")的距离为: " + distance + " 米");}

运行测试用例,返回结果与GEO返回的结果基本吻合。

经纬度(-122.2612767,37.793684)(-122.2469854,37.8104049)的距离为: 2246.057783614703

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言API(高级版)使用

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的智能文本对话AI机器…

归并排序--分治法

代码 #include<iostream> using namespace std;void merge(int arr[], int p, int q, int r, int temp[]) {int i p;int j q 1;int k 0;while (i < q && j < r){if (arr[i] < arr[j]){temp[k] arr[i];}else{temp[k] arr[j];}}while (i < q){t…

智能优化算法应用:基于蚁狮算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蚁狮算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蚁狮算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蚁狮算法4.实验参数设定5.算法结果6.参考文献7.MA…

ptmalloc:从内存虚拟化说起

前言 本文并不局限于ptmalloc的原理&#xff0c;而是从linux的内存虚拟化和系统调用原理出发&#xff0c;结合各种语言实现&#xff0c;讲明内存分配方面的trade off&#xff0c;力图事无巨细&#xff0c;追根究底。本文内容包括但不限于&#xff1a;NIO原理、0拷贝原理、内存…

leetcode:643. 子数组最大平均数 I(滑动窗口)

一、题目 链接&#xff1a;643. 子数组最大平均数 I - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; double findMaxAverage(int* nums, int numsSize, int k) 二、思路 滑动窗口&#xff1a; 先计算数组前k个元素总和&#xff0c;作为第一个窗口&#xff0c;默…

vlog如何降低重复率

大家好&#xff0c;今天来聊聊vlog如何降低重复率&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; vlog如何降低重复率 Vlog作为一种流行的视频日志形式&#xff0c;常常被人们用于记录日常生活、分享经…

pta模拟题——7-34 刮刮彩票

“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示&#xff1a; 每次游戏玩家会拿到一张彩票&#xff0c;上面会有 9 个数字&#xff0c;分别为数字 1 到数字 9&#xff0c;数字各不重复&#xff0c;并以 33 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上…

Lambda表达式规则,用法

Lambda表达式是JDK8新增的一种语法格式 1.作用 简化匿名内部类的代码写法 Lambad用法前提&#xff1a;只能简化函数式接口&#xff08;一般加有Funcationallnterface&#xff09;&#xff08;有且仅有一个抽象方法&#xff09;的匿名内部类 匿名内部类&#xff1a;(本质是对…

2023年终总结-轻舟已过万重山

自我介绍 高考大省的读书人 白&#xff0c;陇西布衣&#xff0c;流落楚、汉。-与韩荆州书 我来自孔孟故里山东济宁&#xff0c;也许是小学时的某一天&#xff0c;我第一次接触到了电脑&#xff0c;从此对它产生了强烈的兴趣&#xff0c;高中我有一个愿望&#xff1a;成为一名计…

设计模式再探——装饰模式

目录 一、背景介绍二、思路&方案三、过程1.装饰模式简介2.装饰模式的类图3.装饰模式代码4.装饰模式&#xff0c;职责父类拆分的奥义5.装饰模式&#xff0c;部件抽象类的无中生有 四、总结五、升华 一、背景介绍 最近公司在做架构模型的时候&#xff0c;涉及到装饰模式的研…

html网页设计 01marquee标签广告滚动(1)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><!-- scrollamount:数字越大&#xff0c;滚动越快direction:滚动方向滚动的类型behaior"slide",文字滚动到边界后就会…

vuepress-----20、全文搜索

默认主题自带的搜索, 只会为页面的标题、h2、h3 以及 tags构建搜索索引。所以尽量将围绕知识点的关键字体现到标题上。而 tags 更为灵活&#xff0c;可以把相关的能想到的关键字都配置到 tags 中&#xff0c;以方便搜索。 默认插件介绍 (opens new window) 默认主体配置 (ope…

电子秤ADC芯片CS1237技术资料问题合集

问题11&#xff1a;实际应用中&#xff0c;多个称重传感器应该怎么与ADC连接&#xff1f; 解答&#xff1a;如果传感器是测量同一物体&#xff08;例如&#xff1a;厨房垃圾处理器&#xff09;&#xff0c;一般建议使用并联的方式。则相同类型的信号线连接在一起。对于传感器的…

C语言指针基础题(一)

目录 例题一题目解析答案 例题二题目解析答案 例题三题目解析答案 例题四题目解析答案 例题五题目解析答案 例题六题目解析答案 例题七题目解析答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x…

C++ 教程 - 01 基础篇

文章目录 C介绍环境配置第一个cpp程序案例练习 变量常量关系运算符逻辑运算符条件运算符位运算符类型转换分支循环程序调用综合案例 C介绍 基于C语言&#xff0c;继承了C的所有语法&#xff1b; 静态类型语言&#xff0c;需要先编译&#xff0c;再执行&#xff1b; 贴近底层硬…

windows下分卷解压文件

我的文件是这样的&#xff1a; 存放路径为&#xff1a;C:\Users\Luli_study\MICCAI_MMAC\fudanuniversity\DDR dataset 首先要进入分卷文件的目录cd&#xff1a; 第一步&#xff1a;cd /path/o/分卷问文件目录 第二步&#xff1a; 执行之后的结果(红色框出来的)&#xff1a; …

Vellum —— Fluid

目录 Vellum fluids setups Fluid tips and troubleshooting Fluid phases Vellum fluids and soft bodies Vellum fluid vs FLIP fluid Vellum fluids setups Vellum fluid solver是基于粒子流体的解算框架&#xff0c;被完全集成到了Vellum动力学系统&#xff08;可与gr…

王道数据结构课后代码题 p149 第3—— 7(c语言代码实现)

目录 3.编写后序遍历二叉树的非递归算法 4.试给出二叉树的自下而上、自右到左的层次遍历算法 &#xff08;有图解代码详解&#xff09;c语言代码实现 5.假设二叉树采用二叉链表存储结构&#xff0c;设计一个非递归算法求二叉树的高度。 ​编辑 6.设一棵二叉树中各结点的值互不…

普冉(PUYA)单片机开发笔记(7): ADC-轮询式多路采样

概述 应用中经常会有使用单片机进行模数转换的需求。PY32F003 具有 1 个 12 位的模拟数字转换器&#xff08;ADC&#xff09;&#xff0c;今天我们一起来使用一下这个 ADC。 数据手册中对 ADC 简介如下。 SAR ADC&#xff1a;逐次逼近式 ADC&#xff0c;原理参见“参考链接&a…

class070 子数组最大累加和问题与扩展-上【算法】

class070 子数组最大累加和问题与扩展-上【算法】 code1 53. 最大子数组和 // 累加和最大子数组和 // 给你一个整数数组 nums // 请你找出一个具有最大累加和的非空子数组 // 返回其最大累加和 // 测试链接 : https://leetcode.cn/problems/maximum-subarray/ dp[i]&#xff…