在给定的N长度的数组中找出M个不相同的数

      算法基本思想是用一个hash表来存储数组中的数是否出现,如果没有出现,则存入结果数组,如果出现过,则直接跳过,php代码实现如下:

<?php
/**
 * 给定N个数,从中找出M个不相同的数,m小于N
 */


function find($a,$m){
    $n = count($a);
    //标志位数组
    $flag = array();

    //结果数组
    $result = array();
    
    $i=0;
    $j=0;
    while($i<$m){
        
        //如果查找完a数组都没有找到,则直接退出
        if($j==$n){
            echo "find nothing";
            exit();
            //break;
        }
        
        $value = $a[$j];
        //如果标志位没有出现,则放入
        if($flag[$value]!==1){
            array_push($result, $value);
            //置位标志位
            $flag[$value]=1;
            $i++;
        }
        $j++;
    }
    
    foreach ($result as $value) {
        echo $value."&nbsp;";
    }
    
    
    
    
}




function main(){
    $a = array(1,2,3,5,5,4,3,2,1);
    $m = 5;
    find($a,$m);
}


main();

    	
?>

转载于:https://my.oschina.net/u/123965/blog/147124

在 Java 中,你可以使用滑动窗口(Sliding Window)算法来解决这个问题。滑动窗口是一种常见的据结构操作技巧,可以用于查找数组中满足特定条件的最大连续子序列。这里的主要思路是维护两个指针,一个指向窗口的起始位置(left),另一个指向窗口的结束位置(right)。我们遍历数组,每次移动右指针,同时检查窗口内的元素是否都互相同。如果相同,我们就继续扩大窗口;如果出现重复,就缩小窗口直到重复元素再出现。 下面是具体的 Java 代码实现: ```java import java.util.HashSet; public class LongestSubarrayWithoutDuplicates { public static int lengthOfLongestSubstring(int[] nums) { if (nums == null || nums.length == 0) return 0; HashSet<Integer> set = new HashSet<>(); int left = 0, maxLen = 0; for (int right = 0; right < nums.length; right++) { while (set.contains(nums[right])) { // 如果右边界处有重复,缩小左边界 set.remove(nums[left]); left++; } set.add(nums[right]); // 将新元素添加到集合中 maxLen = Math.max(maxLen, right - left + 1); // 更新最长子串长度 } return maxLen; } public static void main(String[] args) { int[] nums = {1, 2, 1, 3, 2, 5}; System.out.println(lengthOfLongestSubstring(nums)); // 输出: 4 } } ``` 在这个代码中,`lengthOfLongestSubstring` 函接收一个数组作为参,返回无重复数字的最长子数组长度。函内部通过维护一个哈希集 `set` 来跟踪当前窗口内唯一的元素,利用 `left` 指针来控制窗口范围的收缩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值