有序数组的平方
题目描述:
解题思路:
因为是排序的整数数组,可以循环每个元素并做平方运算,得到原数组排序的新数组,再对新数组进行非递减顺序排序即可
解题方法
- PHP版
class Solution {
/**
* @param Integer[] $nums
* @return Integer[]
*/
function sortedSquares($nums) {
$arr = [];
foreach($nums as $v) {
$arr[] = pow($v, 2);
}
sort($arr);
return $arr;
}
}
- GO版
func sortedSquares(nums []int) []int {
var tmps = []int{}
for _, v := range nums {
var temp = v * v
tmps = append(tmps, temp)
}
sort.Ints(tmps)
return tmps
}
// 双指针解法
func sortedSquares(nums []int) []int {
n := len(nums)
ans := make([]int, n)
i, j := 0, n-1
for pos := n-1; pos >=0; pos--{
v,w := nums[i]*nums[i], nums[j]*nums[j]
if v > w {
ans[pos] = v
i++
} else {
ans[pos] = w
j--
}
}
return ans
}
旋转数组
题目描述 :
解题思路
经观察可以发现,数组旋转n次后,位置变化为 索引值(i)加上旋转量(k)后对其长度(n)取余后的值即为该值在新数组中的索引位置:(i+k)%n
解题方法
PHP
function rotate(&$nums, $k) {
$len = count($nums);
for($i=0;$i<$len;$i++){
$news[($i+$k) % $len] = $nums[$i];
}
ksort($news);
// 后面这两步我也没搞懂为什么要这么做
// 因为在测试过程中,截止到上面直接返回时没有任何问题的,但是
// 在leetcode中测试就是无法通过
// 如果有清楚具体原因的,可以告知在下,谢谢哪位大神了!!!
$nums = $news;
return $nums;
}
GO
// 传统方法,循环逐次移动,现将最后一位替换到第一位,然后将剩余位的其它值逐次后移,共循环k次
// 这种方法理论上是没有问题,leetcode测试用例也全部通过,但是提交时会超出时间限制
func rotate(nums []int, k int) []int {
len := len(nums)
for k>0{
tmp := nums[len-1]
for i := len-1;i>0;i--{
nums[i] = nums[i-1]
}
nums[0] = tmp
k--
}
return nums
}
// 方法二(同上述PHP版思路)
func rotate(nums []int, k int) []int {
new := make([]int, len(nums))
for i,v := range nums {
new[(i+k) % len(nums)] = v
}
copy(nums, new)
return nums
}
// 方法三,多次翻转
func rotate(nums []int, k int) []int {
len := len(nums)
k %= len
reverse(nums, 0, len-1)
reverse(nums, 0, k-1)
reverse(nums,k, len-1)
return nums
}
func reverse(nums[]int, s int, e int)[]int{
for s <e {
nums[s], nums[e] = nums[e], nums[s]
s++
e--
}
return nums
}
特别说明:此次算法本应以双指针为核心,但是无奈本人关于这块知识实在是能力有限,只能尝试其它解决办法